Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.
>>> 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 или нет, и есть ли задействованные аргументы по умолчанию.
Если вам нужно разрушить локальное временное в процессе вычисления чего-то, и вам нужно начать свою манипуляцию из значения аргумента, вам нужно сделать копию.
Передайте объект Context
в конструктор AsyncTask
.
Пример кода:
public class MyTask extends AsyncTask<?, ? ,?> {
private Context mContext;
public MyTask(Context context) {
mContext = context;
}
}
, а затем, когда вы создаете свой AsyncTask
:
MyTask task = new MyTask(this);
task.execute(...);
Полный пример: Многократное использование AsyncTask
Вы говорите, что ваш контекст находится во втором объекте, но ваш второй объект - Integer. Это может быть вашей проблемой? Кроме того, еще одно предложение - поместить ваш класс AsyncTask в качестве частного внутреннего класса для вашей деятельности - таким образом, я уверен, что у вас будет доступ к getApplicationContext ().
Передайте его в конструкторе, а не как параметр метода. Тогда вам не нужно зависеть от общих параметров.
Toast
следует показывать, когда вы вызываетеshow()
на нем в функциях, выполняющихся в потоке пользовательского интерфейса. Вы уверены, что это так? – Wroclai 15 August 2011 в 16:01Toast
s в моем методеonPostExecute()
. Я подозреваю, что вы делаете что-то еще неправильно. – Wroclai 15 August 2011 в 16:04