Область действия объекта и агрессивная очистка на приостановленных экземплярах Activity - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть 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();   
}

1 Ответ

0 голосов
/ 27 сентября 2011

Я не очень понимаю, что вызывает NullPointerException.

Но вы можете проверить мой ответ здесь для AsyncTask, который не является внутренним классомактивность, но static.Внутренние асинхронные задачи, которые запускаются, пропускают контекст / активность, пока они выполняются.Это может быть проблемой для кратковременных задач, но если оно зависает или выполняет в течение длительного времени, то происходит утечка памяти.

Это может подразумевать ответ на ваш вопрос

...