重新启动活动时,Asynctaskloader重新启动加载

时间:2015-06-11 10:27:42

标签: android asynctaskloader

您好我正在实现自定义asynctaskloader以在后台加载数据。问题是当用户在最小化应用程序(或从gallary中选择照片)之后返回活动时,与活动相关联的所有异步装入程序和与活动中的片段相关联的asynctaskloader将重新开始。

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

我的baseAsynctaskLoader类:

import android.content.Context;

import android.support.v4.content.AsyncTaskLoader; import android.util.Log;

公共抽象类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);
}

}

Loader类示例:

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();
    }

}

}

活动中的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){

    }
};

1 个答案:

答案 0 :(得分:0)

这是LoaderManager框架的理想行为 - 如果重新创建封闭的LoadersActivity,它会使用已启动的Fragment重新加载数据

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

结论:您观察到LoaderManager框架的正确行为。

目前尚不清楚您使用Loader尝试完成的是什么,但看起来您选择的工具不正确。如果您的目标是仅执行一次操作,则应使用AsyncTask代替Loaders