У меня есть Activity, которая содержит AsyncTask в качестве внутреннего класса (как я видел в большинстве примеров). Если я запускаю AsyncTask, а затем приостанавливаю действие, удаляясь от него, AsyncTask продолжает выполняться. Насколько я понимаю, это нормальное и ожидаемое поведение.
В Activity есть переменная-член, доступ к которой осуществляется с помощью вызова метода из AsyncTask. Я только что получил NullPointerException, когда AsyncTask выполнялся в фоновом режиме, когда его активность была приостановлена, что, как мне кажется, было собрано GC, когда действие было приостановлено. Мне показалось бы, что объект не следует рассматривать вне области видимости. В Activity все еще выполняется код, так почему же переменные-члены Activity уже начали очищаться?
Как рекомендуется использовать переменные-члены Activity, к которым обращаются через AsyncTasks, которые являются внутренними классами Activity?
Вот пример взаимоотношений моих объектов
public class MyActivity {
MyCustomService myCustomService;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_layout);
myCustomService = ServiceLocator.getInstance(MyCustomService.class);
}
private class FetchDataTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... arg0) {
String data = someOtherService.fetchSomeData();
return data;
}
@Override
protected void onPostExecute(String result) {
refreshControls(result);
}
}
private void refreshControls(String result) {
// this is where the object is null after aggressive cleanup
myCustomService.someMethod();
}