1

我正在使用 AsyncTaskLoader 将数据加载到来自 HTTPRequest 的 ArrayList 中。加载后,数据将通过回收站视图显示为列表。当我单击列表中的一个项目时,会触发一个活动 B,显示该数据的详细屏幕。然后,我有两个选项可以返回列表,一个是通过后退按钮(电话),另一个是通过工具栏上的向上按钮<-android.support.PARENT_ACTIVITY因为它已经实现了 avtivity B。

好吧,后退按钮不会触发加载程序,但上按钮会重新加载整个内容。到底是怎么回事?我希望两者的行为相同,即不按照我在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活动 A 中,我可以像这样调用加载程序

`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) {

}

`

谢谢!

4

1 回答 1

1

当您回来时activity BonStartLoading将再次调用,因为加载程序知道活动状态。现在,当您按下手机的后退按钮时,活动将简单地被带到前面,但如果您按下工具栏中的返回按钮则会创建上一个活动再次,因此您的加载器将被重新初始化并if (mFalla == null)变为真,从而导致调用forceLoad().

您可以显式处理工具栏的后退按钮单击activity B以避免此行为。

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == android.R.id.home){
            onBackPressed(); 
        }
        return true;
    }
于 2016-11-20T20:04:39.377 回答