Android Gestion de la tâche asynchrone


Exemple

Problème:

  • Si, après le démarrage de AsyncTask il y a une rotation de l'écran, l'activité propriétaire est détruite et recréée.
  • Lorsque AsyncTask termine, il souhaite mettre à jour l'interface utilisateur qui pourrait ne plus être valide.

Solution:

En utilisant des chargeurs , on peut facilement surmonter l'activité de destruction / récréation.

Exemple:

Activité principale:

public class MainActivity extends AppCompatActivity 
        implements LoaderManager.LoaderCallbacks<Bitmap> {

    //Unique id for the loader
    private static final int MY_LOADER = 0; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LoaderManager loaderManager = getSupportLoaderManager();

        if(loaderManager.getLoader(MY_LOADER) == null) {
            loaderManager.initLoader(MY_LOADER, null, this).forceLoad();
        }
    }

    @Override
    public Loader<Bitmap> onCreateLoader(int id, Bundle args) {
        //Create a new instance of your Loader<Bitmap>
        MyLoader loader = new MyLoader(MainActivity.this);
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Bitmap> loader, Bitmap data) {
        // do something in the parent activity/service
        // i.e. display the downloaded image
        Log.d("MyAsyncTask", "Received result: ");
    }

    @Override
    public void onLoaderReset(Loader<Bitmap> loader) {

    }
}

AsyncTaskLoader:

public class MyLoader extends AsyncTaskLoader<Bitmap> {
    private WeakReference<Activity> motherActivity;

    public MyLoader(Activity activity) {
        super(activity);
        //We don't use this, but if you want you can use it, but remember, WeakReference
        motherActivity = new WeakReference<>(activity);
    }

    @Override
    public Bitmap loadInBackground() {
        // Do work. I.e download an image from internet to be displayed in gui.
        // i.e. return the downloaded gui
        return result;
    }
}

Remarque:

Il est important d'utiliser la bibliothèque de compatibilité v4 ou non, mais n'utilisez pas une partie de l'une ou l'autre partie, car cela entraînerait des erreurs de compilation. Pour vérifier, vous pouvez consulter les importations pour android.support.v4.content et android.content (vous ne devriez pas avoir les deux).