您好我正在实现自定义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){
}
};
答案 0 :(得分:0)
这是LoaderManager
框架的理想行为 - 如果重新创建封闭的Loaders
或Activity
,它会使用已启动的Fragment
重新加载数据
事实上,Loaders
的某些实现不会重新加载数据,而只是提供对内部缓存的最新数据的访问。
结论:您观察到LoaderManager
框架的正确行为。
目前尚不清楚您使用Loader
尝试完成的是什么,但看起来您选择的工具不正确。如果您的目标是仅执行一次操作,则应使用AsyncTask
代替Loaders
。