Up навигация перезагружает загрузчик, но обратная навигация не
Я использую AsyncTaskLoader для загрузки данных в ArrayList из HTTPRequest. После загрузки данные отображаются в виде переработчика в виде списка. Когда я нажимаю на элемент списка, запускается действие B, показывающее подробный экран с этими данными. Затем у меня есть два варианта, чтобы вернуться к списку, один с помощью кнопки "назад" (телефон), а другой с помощью кнопки "вверх" <- на панели инструментов, так как Avility B имеет android.support.PARENT_ACTIVITY
реализованы.
Ну, кнопка "назад" не запускает загрузчик, но кнопка "перезагружает" все это. Что здесь происходит? Я хочу, чтобы оба вели себя одинаково, то есть не перезагружались, как указано в onStartLoading()
,
Это мой загрузчик AsynTask, который вызывается как обычно, путем реализации LoaderCallbacks<List<T>>
интерфейс
public class FallaLoader extends AsyncTaskLoader<List<Falla>> {
private String mUrl;
private List<Falla> mFalla;
FallaLoader(Context context, String url)
{
super(context);
mUrl = url;
}
@Override
protected void onStartLoading()
{
if (mFalla == null) {
// we have no data, so kick off loading
forceLoad();
}
else {
// use cached data, fallas won't change for a year, so... just needed everytime I start
deliverResult(mFalla);
}
}
// This happens in the Background thread
@Override
public List<Falla> loadInBackground()
{
if (mUrl == null)
{
return null;
}
// Perform the network request, parse the response, and extract a list of earthquakes.
// pass the context since it will be needed to get the preferences
return Utils.fetchFallasData(mUrl, getContext());
}
@Override
public void deliverResult(List<Falla> data)
{
// We’ll save the data for later retrieval
mFalla = data;
super.deliverResult(data);
}}
В onCreate
Деятельности А, у меня есть вызов к загрузчику, как это
`LoaderManager loaderManager = getLoaderManager(); loaderManager.initLoader(0, null, this);
а затем я реализую интерфейс:
@Override
public Loader<List<Falla>> onCreateLoader(int i, Bundle bundle)
{
return new FallaLoader(this, F_URL);
}
@Override
public void onLoadFinished(Loader<List<Falla>> loader, List<Falla> fallas)
{
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
mEmptyStateTextView.setText(R.string.no_fallas);
if (fallas != null && !fallas.isEmpty())
{
adapter.swap(fallas);
}
}
@Override
public void onLoaderReset(Loader<List<Falla>> loader) {
}
`
Спасибо!
1 ответ
Когда вы вернетесь из activity B
, onStartLoading
будет вызван снова, так как загрузчик знает о состояниях активности. Теперь, когда вы нажимаете кнопку "Назад" на телефоне, действие будет просто перенесено на передний план, но если вы нажмете кнопку "Назад" на панели инструментов, предыдущее действие будет создано снова, следовательно, ваш загрузчик будет быть повторно инициализированным и if (mFalla == null)
станет правдой, в результате чего призыв к forceLoad()
,
Вы можете явно обработать нажатие кнопки назад на панели инструментов в activity B
чтобы избежать этого поведения.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == android.R.id.home){
onBackPressed();
}
return true;
}