处理 AsyncTask
问题:
- 如果在 AsyncTask启动后有一个屏幕旋转,则拥有活动将被销毁并重新创建。
- 当 AsyncTask完成时,它想要更新可能无效的 UI。
解:
使用装载机 ,可以轻松克服活动破坏/娱乐。
例:
主要活动:
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;
    }
}
注意:
使用 v4 兼容性库是否很重要,但不要使用其中一部分和另一部分,因为这会导致编译错误。要查看你可以查看 android.support.v4.content 和 android.content 的导入(你不应该同时拥有)。