首页 > 解决方案 > TabLayout 中的 AsyncTask

问题描述

我有一个带有 TabLayout 的应用程序。每个选项卡都是一个片段,其中三个包含一个 AsyncTask 用于执行繁重的后台操作。请参见下面的代码示例。backgroundLoadList AsyncTask 正在调用getTabNetworkList以收集 Array 列表中的数据。

现在,我正在启动应用程序,并且由于我是标签下方的一个标签,因此系统已经在后台预加载了下方的标签(setOffscreenPageLimit设置为 1)。如果我然后旋转屏幕,getTabNetworkList在它的操作中间被取消,不再附加到上下文,无法访问 catch 子句中的资源字符串并抛出异常。AsyncTask 在onDestroy中被正确取消。

java.lang.IllegalStateException: Fragment Tab_Network{80b32b2 #2 id=0x7f090030 android:switcher:2131296304:2} 未附加到上下文。

如果我在 catch 子句中对资源字符串进行硬编码,它当然可以工作,但异常仍然存在。

您对我如何摆脱此异常有任何想法吗?非常感谢!

异步任务:

private class backgroundLoadList extends AsyncTask<Void, Integer, ArrayList<CustomDataStructure>> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mSpinner.setVisibility(View.VISIBLE);
    }

    @Override
    protected ArrayList<CustomDataStructure> doInBackground(Void... voids) {
        ArrayList<CustomDataStructure> result = getTabNetworkList();
        return result;
    }

    @Override
    protected void onPostExecute(ArrayList<CustomDataStructure> customDataStructures) {
        adapter.listItems.retainAll(customDataStructures);
        adapter.listItems.addAll(customDataStructures);
        adapter.notifyDataSetChanged();
        mSpinner.setVisibility(View.GONE);
        super.onPostExecute(customDataStructures);
    }
}

检索列表:

private ArrayList<CustomDataStructure> getTabNetworkList() {
            CustomDataStructure item;
            ArrayList<CustomDataStructure> items = new ArrayList<>();
            try {
              item = new CustomDataStructure(getResources().getString(R.string.itemDescType), networkRoaming);
              items.add(item);
            // long list with further items is coded here...
            } catch (SecurityException e) {
            // Exception occurs on the next line because the context is not available anymore for getting the resources...
              item = new CustomDataStructure(getResources().getString(R.string.itemInfo), getResources().getString(R.string.textNotAvailable));
              items.add(item);
            }
            return items;
    }

标签: javaandroidandroid-fragmentsandroid-asynctaskandroid-tablayout

解决方案


推荐阅读