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
重新加载数据,以防封闭的 Activity
或 Fragment
重新加载-创建。
事实上,Loaders
的某些实现不会重新加载数据,而只是提供对内部缓存的最新数据的访问。
底线:您观察到 LoaderManager
框架的正确行为。
不清楚您要使用 Loader
完成什么,但您似乎选择了错误的工具。如果您的目标是只执行一次操作,那么您应该使用 AsyncTask
而不是 Loaders
。
您好,我正在实施自定义 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
重新加载数据,以防封闭的 Activity
或 Fragment
重新加载-创建。
事实上,Loaders
的某些实现不会重新加载数据,而只是提供对内部缓存的最新数据的访问。
底线:您观察到 LoaderManager
框架的正确行为。
不清楚您要使用 Loader
完成什么,但您似乎选择了错误的工具。如果您的目标是只执行一次操作,那么您应该使用 AsyncTask
而不是 Loaders
。