2015-06-11 2 views
2

Привет Я реализую пользовательский asynctaskloader для загрузки данных в фоновом режиме. Проблема заключается в том, когда пользователь возвращается к активности после того, как он сводит к минимуму приложение (или выбирает фотографию из галереи), все асинхронные загрузчики, связанные с активностью, и асинтетические загрузчики, связанные с фрагментами в действии, начинаются снова и снова.Asynctaskloader перезагружает загрузку при перезапуске активности

Как я могу предотвратить перезагрузку загрузчика после перезагрузки?

Мой baseAsynctaskLoader класс:

import android.content.Context; 

импорт android.support.v4.content.AsyncTaskLoader; импорт 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); 
} 

}

погрузчик Класс образца:

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

Это желаемое поведение LoaderManager рамки - он заботится о перегрузке данных с инициированной Loaders в случае вмещающими Activity или Fragment прибудет воссоздано.

Фактически, некоторые реализации Loaders не перезагружают данные, а просто обеспечивают доступ к последним данным, которые были кэшированы изнутри.

Нижняя линия: вы наблюдаете правильное поведение рамки LoaderManager.

Непонятно, что именно вы пытаетесь выполнить с помощью своего Loader, но похоже, что вы выбрали неправильный инструмент. Если ваша цель - выполнить действие только один раз, то вы должны использовать AsyncTask вместо Loaders.

Смежные вопросы