如果在工作期间旋转屏幕,如何获得装载机的结果?

时间:2016-09-08 00:10:40

标签: android loader screen-rotation

我听说加载器可以帮助在方向更改期间保存异步作业的结果。我有一个片段,用一些参数执行一个加载器。我该怎么做才能重新连接到装载机?重要提示:如果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);
    }
}

我想在屏幕旋转时重新连接它。如果我处理了结果,我不想再次触发它。

3 个答案:

答案 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

希望这对你有所帮助