Android Honeycomb 中的加载程序

Posted

技术标签:

【中文标题】Android Honeycomb 中的加载程序【英文标题】:Loaders in Android Honeycomb 【发布时间】:2011-06-22 16:45:51 【问题描述】:

我正在尝试弄清楚如何在 android 3.0 中使用 Loaders,但似乎无法使其正常工作。文档只描述了使用CursorLoader,但我使用的是AsyncTaskLoader

从文档看来,您应该只需要实现AsyncTaskLoader.loadInBackground(),但它永远不会在getLoaderManager().initLoader() 之后被调用,然后在回调中创建加载程序。

我可以看到调试消息说Created new loader LoaderInfo4040a828 #0 : ArticleDataLoader4036b350,所以它似乎已成功创建。

是否有可能加载器当前在 SDK 中已损坏,或者在创建加载器后需要调用某些方法? (他们在CursorLoader 示例中没有这样做)。

编辑:似乎在从initLoader() 返回的加载器上调用forceLoad() 至少会开始加载,但这意味着您无法正确处理旋转:(

【问题讨论】:

如果您找到了答案,请告诉我。我什么都没找到。 还有code.google.com/p/android/issues/detail?id=14944 提到了与“编辑”评论相同的解决方法。 是的,这是我的错误报告 :) 你检查过developer.android.com/reference/android/app/LoaderManager.html吗? 【参考方案1】:

Dianne Hackborn 在 bug tracker 上回复了我们,并推荐我们参考静态库实现。 CursorLoader 正在执行 forceLoad() 这就是它工作的原因。

请参阅我附加的课程,以了解在错误跟踪器的大多数简单情况下为您处理此问题的课程:http://code.google.com/p/android/issues/detail?id=14944

【讨论】:

他们确实需要记录 CPL >. 这真的很糟糕。因此此处显示的示例:developer.android.com/reference/android/content/… 如果您使用支持库,除非您覆盖 onStartLoading 所以现在我有了自己的 ASyncTaskLoader 参考源,使用支持库:blog.blundell-apps.com/…【参考方案2】:

您需要重写 onStartLoading() 方法。看developer website上的例子。

    /**
     * Handles a request to start the Loader.
     */
    @Override protected void onStartLoading() 
        if (mApps != null) 
            // If we currently have a result available, deliver it
            // immediately.
            deliverResult(mApps);
        

        // Start watching for changes in the app data.
        if (mPackageObserver == null) 
            mPackageObserver = new PackageIntentReceiver(this);
        

        // Has something interesting in the configuration changed since we
        // last built the app list?
        boolean configChange = mLastConfig.applyNewConfig(getContext().getResources());

        if (takeContentChanged() || mApps == null || configChange) 
            // If the data has changed since the last time it was loaded
            // or is not currently available, start a load.
            forceLoad();
        
    

【讨论】:

【参考方案3】:

亚历克斯; 您是否尝试验证 onLoadInBackground () 是否被调用?

onLoadInBackground():在工作线程上调用以执行实际加载。实现不应该直接传递结果,而是应该从这个方法返回结果,最终会在 UI 线程上调用 DeliverResult(D)。如果实现需要在 UI 线程上处理结果,他们可能会覆盖 DeliverResult(D) 并在那里执行。

【讨论】:

不,除非你执行 forceLoad(),否则它不会被调用。

以上是关于Android Honeycomb 中的加载程序的主要内容,如果未能解决你的问题,请参考以下文章

Honeycomb 中的片段加载微调器/对话框

Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?

Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?

Android HoneyComb DatePicker 文本颜色

Android Honeycomb 有文件大小限制吗?

ActionBar pre Honeycomb