【问题标题】:Retaining ASyncTask from activity, NOT fragment从活动中保留 ASyncTask,而不是片段
【发布时间】:2012-12-21 02:53:35
【问题描述】:

所以..

我所拥有的如下,一个复杂的基于片段的浏览器,在我的活动中使用 tabhosts 等。这是基本设置。

创建后,我使用 AsyncTask 从我的数据库中获取一些数据。当 ASyncTask 完成后,我使用 fragmentmanager 找到 viewpager 的各个片段,并在每个片段中调用函数来设置数据。例如,在片段 A 中,数据被设置为列表适配器中的列表,而在片段 B 中,数据被绘制在地图上。

我已经这样设置了,因为所有片段都使用相同的数据,我只想调用一个 ASyncTask。效果很好。

我的问题是当用户在加载时旋转屏幕。因此,您可以使用 setRetainInstance 从片段中调用 ASyncTask,之前在活动中可以使用 onRetainNoneConfigurationInstance.. 但现在已弃用。

我花了很长时间搜索,似乎没有人对这种特定情况有答案..

谁能给点建议?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    您可以使用不可见的Fragment 来保留您的状态。它与onRetainNoneConfigurationInstance 基本相同,但未弃用。

    http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html#config-changes

    示例中有一个错误,您必须将 RetainFragment 添加到 FragmentManager,否则将无法恢复。

    public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
        RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
        if (fragment == null) {
            fragment = new RetainFragment();
            fm.beginTransaction().add(fragment, TAG).commit(); // add this
        }
        return fragment;
    }
    

    【讨论】:

    • 查看加载器 - 应该可以解决问题而不会看起来很笨拙
    • @ThomasClowes 您还可以将 Activity 或其一部分转换为片段,并将该部分包含在片段中。因此,如果您的 tabhost 或 viewpager 当前由 Activity 管理,请将该部分提取到片段中。片段可以包含其他片段
    【解决方案2】:

    使用 IntentService 从数据库中获取数据,您不必担心配置更改。发送 Intent 以获取数据,使用 LocalBroadcastManager 将广播 Intent 发送回您要通知的任何其他组件。

    【讨论】:

    • 它是一个答案.. 它会起作用,但是 AsyncTask 是为我想要做的事情而设计的,而 IntentService 不是..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多