Статическое поле будет пропускать контексты - PullRequest
0 голосов
/ 07 мая 2018

Это мой код для всплеска активности:

public class Loading extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            Thread.sleep(4000);
        }catch(InterruptedException ie){
            ie.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
        startActivity(homeIntent);
        overridePendingTransition(R.anim.open_next, R.anim.close_main);
    }
}

Все работает нормально, но отображается следующее предупреждение:

This AsyncTask class should be static or leaks might occur (myapp.activities.ActivitySplash.Loading) less... (Ctrl+F1) 
A static field will leak contexts.

Если я изменю класс на статические, будут использоваться нестатические методы, и будут появляться ошибки:

Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
startActivity(homeIntent);
overridePendingTransition(R.anim.open_next, R.anim.close_main);

Так что, если я буду использовать закрытый класс, получит предупреждение, если попытается использовать статический класс, получит ошибки. Что делать, чтобы иметь четкий код?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

AsyncTask в качестве нестатического внутреннего класса получит ссылку на свой родительский класс, Activity. Отсюда и предупреждение в вашем коде.

Чтобы исправить это и по-прежнему иметь доступ к своей деятельности, передайте свою активность как слабая ссылка в конструктор AsyncTask.

Затем вы можете вызвать код вашего намерения в onPostExecute и проверить, сохраняется ли ваша активность в памяти.

По-моему, вам также следует подумать о том, чтобы отойти от AsyncTask. Проверьте RxJava или современный JobScheduler .

0 голосов
/ 07 мая 2018

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

...