Android APP Null Pointer Exception ApplicationInfo [дубликат]

Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.

>>> def foo(a):
    a.append(5)
    print a

>>> a  = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]

В этом нет значений по умолчанию код, но вы получаете точно такую ​​же проблему.

Проблема в том, что foo является изменением изменчивой переменной, переданной от вызывающего, когда вызывающий объект не ожидает этого , Код, подобный этому, был бы хорош, если бы функция была вызвана как-то вроде append_5; то вызывающий абонент будет вызывать функцию, чтобы изменить значение, которое они передают, и поведение будет ожидаться. Но такая функция вряд ли примет аргумент по умолчанию и, вероятно, не вернет список (поскольку у вызывающего уже есть ссылка на этот список, тот, который он только что передал).

Ваш оригинал foo с аргументом по умолчанию не должен изменять a, был ли он явно передан или получил значение по умолчанию. Ваш код должен оставлять изменчивые аргументы отдельно, если из контекста / имени / документации не ясно, что аргументы должны быть изменены. Использование измененных значений, передаваемых в качестве аргументов, таких как локальные временные файлы, является крайне плохой идеей, независимо от того, находимся ли мы на Python или нет, и есть ли задействованные аргументы по умолчанию.

Если вам нужно разрушить локальное временное в процессе вычисления чего-то, и вам нужно начать свою манипуляцию из значения аргумента, вам нужно сделать копию.

23
задан dotty 15 August 2011 в 15:46
поделиться

4 ответа

Передайте объект Context в конструктор AsyncTask.

Пример кода:

public class MyTask extends AsyncTask<?, ? ,?> {
    private Context mContext;

    public MyTask(Context context) {
        mContext = context;
    } 
}

, а затем, когда вы создаете свой AsyncTask:

MyTask task = new MyTask(this);
task.execute(...);
76
ответ дан Wroclai 22 August 2018 в 00:06
поделиться
  • 1
    Тост никогда не отображается. Любые другие идеи? – dotty 15 August 2011 в 16:00
  • 2
    Toast следует показывать, когда вы вызываете show() на нем в функциях, выполняющихся в потоке пользовательского интерфейса. Вы уверены, что это так? – Wroclai 15 August 2011 в 16:01
  • 3
    Тост находится в моем методе onPostExecute (). Образец кода выше. – dotty 15 August 2011 в 16:02
  • 4
    Я могу отлично показать Toast s в моем методе onPostExecute(). Я подозреваю, что вы делаете что-то еще неправильно. – Wroclai 15 August 2011 в 16:04
  • 5
    не может ли это вызвать утечку, если активность будет уничтожена до завершения асинтез? – MikeIsrael 19 December 2013 в 14:27
2
ответ дан Fernando JS 22 August 2018 в 00:06
поделиться

Вы говорите, что ваш контекст находится во втором объекте, но ваш второй объект - Integer. Это может быть вашей проблемой? Кроме того, еще одно предложение - поместить ваш класс AsyncTask в качестве частного внутреннего класса для вашей деятельности - таким образом, я уверен, что у вас будет доступ к getApplicationContext ().

0
ответ дан Jack 22 August 2018 в 00:06
поделиться

Передайте его в конструкторе, а не как параметр метода. Тогда вам не нужно зависеть от общих параметров.

2
ответ дан Nikolay Elenkov 22 August 2018 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: