activity重启时asynctaskloader重启加载

Asynctaskloader restart loading when the activity restart

您好,我正在实施自定义 asynctaskloader 以在后台加载数据。问题是当用户在最小化应用程序(或从图库中选择照片)后返回 activity 时,所有与 activity 关联的异步任务加载器和与 [=39] 中的片段关联的异步任务加载器=] 重新开始。

如何在 activity 重新启动时阻止加载程序重新启动加载过程?

我的 baseAsynctaskLoader class:

import android.content.Context;

导入android.support.v4.content.AsyncTaskLoader; 导入 android.util.Log;

public 抽象 class BaseAsyncTaskLoader 扩展 AsyncTaskLoader{

private static final String TAG = "BaseAsyncTaskLoader";

protected Context context;
protected Object mData;

public BaseAsyncTaskLoader( Context context ) {
    super(context);
    Log.d(TAG, "BaseLoader");
    this.context = context.getApplicationContext();
}

@Override
public abstract Object loadInBackground();

@Override
public void deliverResult(Object data){
    Log.d( TAG, "deliverResult" );
    if (isReset()) {
        return;
    }
    mData = data;

    if (isStarted()) {
        super.deliverResult(data);
    }

}

@Override
protected void onStartLoading(){
    Log.d( TAG, "onStartLoading" );

    if (mData != null) {
        deliverResult(mData);
    }

    if (takeContentChanged() || mData == null) {
        forceLoad();
    }
}

@Override
protected void onStopLoading(){
    Log.d( TAG, "onStopLoading" );
    cancelLoad();
}

@Override
protected void onReset(){
    Log.d( TAG, "onReset" );
    super.onReset();
    onStopLoading();
    if(mData !=null){
        mData=null;
    }
}

@Override
public void onCanceled(Object data){
    Log.d( TAG, "onCanceled" );
    super.onCanceled(data);
}

}

加载器class样本:

public class AddDetailService extends BaseAsyncTaskLoader{

Activity activity;
Bundle bundle;

String outputstringrespone="";

public AddCarService(Activity activity, Bundle bundle){
    super(activity);
    this.activity = activity;
    this.bundle = bundle;
}
@Override
public Object loadInBackground(){
    try{

        int userId = bundle.getInt(USER_ID);
        int modelId = bundle.getInt(MODEL_ID);
        outputstringrespone = addDetails(userId, modelId);

    }catch(Exception e){
        Log.d(TAG, e.toString());
    }
    return null;
}

@Override
public void deliverResult(Object data){
    super.deliverResult(data);
    Log.d(TAG,"output--"+outputstringrespone);
    if(outputstringrespone.equalsIgnoreCase("Success")){
        Toast.makeText(activity, "Details Added Successfully", Toast.LENGTH_SHORT).show();

    }else {
        Toast.makeText(activity, "Details not added",Toast.LENGTH_SHORT).show();
    }

}

}

activity 中的 LoaderCallback:

getLoaderManager().initLoader(LoaderId.ADD_DETAIL, bundle, addDetailsCallbacks);

LoaderManager.LoaderCallbacks addDetailsCallbacks = new LoaderManager.LoaderCallbacks(){
    @Override
    public Loader onCreateLoader(int id, Bundle args){
        return new AddDetailService(getActivity(), args);
    }

    @Override
    public void onLoadFinished(Loader loader, Object data){
        getLoaderManager().destroyLoader(LoaderId.ADD_DETAIL);
    }

    @Override
    public void onLoaderReset(Loader loader){

    }
};

这是 LoaderManager 框架的预期行为 - 它负责使用启动的 Loaders 重新加载数据,以防封闭的 ActivityFragment 重新加载-创建。

事实上,Loaders的某些实现不会重新加载数据,而只是提供对内部缓存的最新数据的访问。

底线:您观察到 LoaderManager 框架的正确行为。

不清楚您要使用 Loader 完成什么,但您似乎选择了错误的工具。如果您的目标是只执行一次操作,那么您应该使用 AsyncTask 而不是 Loaders