У меня есть сомнения по поводу уничтожения действий и объектов.
Пока я присоединяю и отсоединяю действие от AsyncTask, я не изменяю ArrayAdapter из asynctask (см. Код).Итак, я получаю несколько подключенных и отсоединенных действий (должны изменить ориентацию) и только одна задача, выполняющая и модифицирующая ОДИН адаптер, который, в свою очередь, является одним из первых действий, которые создали задачу.Поэтому, когда я присоединяю задачу в onCreate (), я просто устанавливаю адаптер с тем, который содержит задачу, в которой, в свою очередь, обрабатываются все значения (в примере просто список чисел-пустышек).
Как это может быть возможным?Я думал, что onDestroy () удалит само действие и его атрибуты, и поэтому я получу исключение нулевого указателя или что-то подобное при попытке доступа к ArrayAdapter исходного действия из AsynkTask, но приведенный ниже код работает!
private static class TestingTask extends AsyncTask<Void, Integer, Void> {
private TestingActivity mActivity; // extends ListActivity
private ArrayAdapter<String> mAdapter;
private boolean mIsFinished;
private TestingTask(Context activity) {
attach(activity);
mAdapter = (ArrayAdapter<String>)mActivity.getListAdapter();
mIsFinished = false;
}
private void attach(Context activity) {
mActivity = (TestingActivity)activity;
}
private void detach() {
mActivity = null;
}
protected Void doInBackground(Void... params) {
for (int i = 0; i < 100000; i++) {
publishProgress(i);
}
return null;
}
protected void onProgressUpdate(Integer... values) {
if (!isCancelled()) {
mAdapter.add(values[0].toString());
}
}
// ...
}
Это потому, что задача сохраняет активную ссылку на объект ArrayAdapter и поэтому не удаляется?Или это что-то еще?
Я также столкнулся с другим «подобным случаем», в котором я возвратил атрибут Activity из onRetainNonConfigurationInstance (), скажем, A a, который имел видимость над B b (который является еще одним атрибутом Activity).Затем, при попытке доступа к экземпляру b через a, проблем нет, и я подумал, что мне понадобится оболочка для хранения двух экземпляров (a и b), иначе я получу исключение при попытке доступа к b (что я и делаюна самом деле не сохранить).Я не знаю, относится ли это к ширине предыдущего случая, в котором объекты, которые я предполагал недоступными, действительно есть, возможно, из-за активной ссылки на них, которая не вызывает удаления?
Спасибо!