我听说加载器可以帮助在方向更改期间保存异步作业的结果。我有一个片段,用一些参数执行一个加载器。我该怎么做才能重新连接到装载机?重要提示:如果LoaderCallbacks.onLoadFinished()已经处理了结果,我不想重新启动加载程序。
更详细:我有一个带有文本字段的片段。当用户输入一些文本并按Enter键时,我应该开始使用网络请求进行搜索。我是通过启动加载器来实现的
private void loadFirstPage() {
LoaderManager loaderManager = getLoaderManager();
data.currentPage = 1;
Bundle args = new Bundle();
args.putString(VacanciesAsyncLoader.ARG_SEARCH_TEXT, data.query);
args.putInt(VacanciesAsyncLoader.ARG_ITEMS_PER_PAGE, Const.ITEM_PER_PAGE);
args.putInt(VacanciesAsyncLoader.ARG_PAGE_NUMBER, data.currentPage);
loaderManager.restartLoader(GET_VACANCIES_LOADER_ID, args, this);
}
@Override
public void onViewCreated(Bundle savedInstanceState) {
super.onViewCreated(savedInstanceState);
if (savedInstanceState == null) {
// ...
} else {
data = savedInstanceState.getParcelable(KEY_DATA);
restoreViewState(data);
reconnectLoaderIfNeeded();
}
}
private void reconnectLoaderIfNeeded() {
EnumSet<State> loadingStates =
EnumSet.of(State.REFRESHING, State.LOADING_FIRST_PAGE, State.LOADING_ADDITIONAL_PAGE);
if (loadingStates.contains(data.state)) {
getLoaderManager().initLoader(GET_VACANCIES_LOADER_ID, null, this);
}
}
我想在屏幕旋转时重新连接它。如果我处理了结果,我不想再次触发它。
答案 0 :(得分:3)
如果这只是一次性请求,那么典型的模式应该是:
发起请求:
getLoaderManager().restartLoader(LOADER_ID, args, callbacks);
在onCreate()
中,检查Loader是否仍在运行:
if (savedInstanceState != null) {
// If it exists, init with null arguments (since they won't
// be used) to reconnect the callbacks
if (getLoaderManager().getLoader(LOADER_ID) != null) {
getLoaderManager().initLoader(LOADER_ID, null, callbacks);
}
}
在onLoadFinished()
中,销毁加载程序:
getLoaderManager().destroyLoader(LOADER_ID);
假设您已正确实施了Loader
,这应该可以解决问题。
答案 1 :(得分:0)
您可以在Activity(片段)中设置此代码。
AndroidManifest.xml:
android:configChanges="orientation|keyboardHidden"
...
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
>
答案 2 :(得分:0)
本文帮助我处理有关异步任务的方向更改。它与保留碎片有关:
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
希望这对你有所帮助