Android Passer l'activité en tant que WeakReference pour éviter les fuites de mémoire


Exemple

Il est courant qu'un AsyncTask exige une référence à l'activité qui l'a appelé.

Si AsyncTask est une classe interne de l'activité, vous pouvez la référencer directement, ainsi que toutes les variables / méthodes membres.

Si, cependant, AsyncTask n'est pas une classe interne de l'activité, vous devrez transmettre une référence d'activité à la tâche asynchrone. Lorsque vous cela effectuez, un problème potentiel qui peut se produire est que AsyncTask conservera la référence de l'activité jusqu'à ce que AsyncTask ait terminé son travail dans son thread d'arrière-plan. Si l'activité est terminée ou supprimée avant que le thread d'arrière-plan d'AsyncTask ne soit terminé, AsyncTask aura toujours sa référence à l'activité et ne pourra donc pas être collectée.

Cela entraînera une fuite de mémoire.

Pour éviter cela, utilisez une référence WeakRefer dans AsyncTask au lieu d'avoir une référence directe à l'activité.

Voici un exemple d'AsyncTask utilisant une référence WeakRefer:

private class MyAsyncTask extends AsyncTask<String, Void, Void> {

    private WeakReference<Activity> mActivity;

    public MyAsyncTask(Activity activity) {
        mActivity = new WeakReference<Activity>(activity);
    }

    @Override
    protected void onPreExecute() {
        final Activity activity = mActivity.get();
        if (activity != null) {
            ....
        }
    }

    @Override
    protected Void doInBackground(String... params) {
        //Do something
        String param1 = params[0];
        String param2 = params[1];
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        final Activity activity = mActivity.get();
        if (activity != null) {
            activity.updateUI();
        }
    }
} 

Appel de la tâche asynchrone à partir d'une activité:

new MyAsyncTask(this).execute("param1", "param2");

Appel de la tâche Async depuis un fragment:

new MyAsyncTask(getActivity()).execute("param1", "param2");