【发布时间】:2019-11-28 22:14:09
【问题描述】:
我的应用程序从 Internet 下载 JSON 数据并将其显示为 RecyclerView 列表。这是通过 LoaderManager/Loader 方式实现的。通过单击按钮启动操作。
在 onCreate 中,如果该特定加载器已经存在,我调用 initLoader(),以便为其提供新的回调,绑定到新的 Activity(我这样做是为了确保用户在下载过程中旋转屏幕时不会丢失进度)。现在我已经安排好在屏幕旋转时保留有组织的列表数据。例如,如果我加载数据然后旋转屏幕,调用 initLoader() 将正确推断出数据已经加载并调用 onLoadFinished()(我怀疑加载的数据在内部以某种方式缓存)。
让我感到困惑的是 loadInBackground() 也会以某种方式被调用,绝对没有必要。
阅读文档对我来说并没有很清楚。
如何仅在 onCreate() 时将新的回调传递给我的加载器而不调用不必要的操作?
编辑:这是 AsyncTaskLoader 代码。
@NonNull
@Override
public Loader<String> onCreateLoader(int id, final Bundle args) {
return new AsyncTaskLoader<String>(this) {
@Override
protected void onStartLoading() {
Log.w("DBG", "onStartLoading");
if (args == null) return;
Log.w("DBG", "about to forceLoad");
forceLoad();
}
@Override
public String loadInBackground() {
Log.w("DBG", "loadInBackground");
String baseId = args.getString("baseId");
String quoteId = args.getString("quoteId");
String exchange = args.getString("exchange");
Uri uri = buildUri(baseId, quoteId, exchange);
String txt = uri.toString();
Log.i("Uri built: ", txt);
String response = "";
try {
URL url = new URL(uri.toString());
response = getResponseFromHttpUrl(url);
} catch (IOException e) {
e.printStackTrace();
}
final int PAUSE_SEC = 5;
try {
Thread.sleep(PAUSE_SEC * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return response;
}
};
}
【问题讨论】:
-
您能否提供您的
AsyncTaskLoader()的代码?听起来你在onStartLoading()中无条件地调用forceLoad()。 -
不完全是,我加了代码