【问题标题】:Android Combine ImageDownload with CursorLoaderAndroid 结合 ImageDownload 和 CursorLoader
【发布时间】:2012-09-27 00:31:52
【问题描述】:

我正在使用带有 ImageDownloader 的非常简单的 CursorLoader。 ImageDownloader 正在运行,除了 CursorLoader 之外的所有内容都完成了,然后 ImageDownloader 开始下载图像,但 GridView 没有使用下载的图像进行更新..

在我的 ListFragment 中,我有以下 onActivityCreated 方法:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    Log.d(TAG, "onActivityCreated");

    super.onActivityCreated(savedInstanceState);

    cursorAdapter = new OURSVPImageAdapter(getActivity(), null);

    // set the adapter on the gridview
    mGridView.setAdapter(cursorAdapter);

    // load the data
    getActivity().getSupportLoaderManager().initLoader(2, null, this);
}

我的CursorLoader如下:

public static final class PhotoCursorLoader extends SimpleCursorLoader {

    Context mContext;

    public PhotoCursorLoader(Context context) {
        super(context);

        Log.d("PhotoCursorLoader", "Constructor");

        mContext = context;
    }

    @Override
    public Cursor loadInBackground() {
        Log.d("PhotoCursorLoader", "loadInBackground");

        PhotosDataSource datasource = new PhotosDataSource(mContext);

        # STEP 1
        return datasource.getAllPhotos(((EventActivity) mContext).getEventId());
    }

}

检索所有照片的标记为# STEP 1的行只是检索光标的方法,如下所示:

public Cursor getAllPhotos(long event_id) {
    Log.d(TAG, "getAllPhotos");

    Cursor mCursor = getWritableDatabase().query(true, TABLE_NAME, COLUMNS_PHOTOS, DatabaseConstants.KEY_EVENT_ID + "=" + event_id, 
            null, null, null, null, null);

    return mCursor; 
}

因此,这是 ListFragment 的 CursorLoader,当返回该 Cursor 时,它假定它是完整的,这是正确的。据我了解,setAdapter() 方法实际上会触发 getView 方法。

我遇到的问题是一切似乎都运行良好,我的日志输出正确输出图像的 url,断点都显示合法数据,但问题是我的网格视图永远不会得到使用 ImageDownloader 检索到的图像进行更新。

编辑 这是我正在使用的SimpleCursorLoaderhttps://gist.github.com/1217628

【问题讨论】:

    标签: android android-gridview android-loadermanager android-cursor android-loader


    【解决方案1】:

    再一次,问题很可能是您从父 Activity 管理 Fragment 的加载程序。 ActivityFragment 生命周期不会相互同步(至少不是以可预测的方式),因此您调试问题的尝试实际上并没有让您有任何收获。保证可预测行为的最简单方法是让每个单独的组件使用自己的LoaderManager(而不是让您的Fragments 访问getActivity().getSupportLoaderManager())。

    【讨论】:

    • 我认为你习惯的和我的代码在做什么的主要区别之一是我正在使用 ActionbarSherlock.. 它使用支持库.. @Overrides 和方法有时不可用.. 比如.. 我必须使用 getSupportLoaderManager 而不是 getLoaderManager ..
    • 它与ActionBarSherlock 相同。只要您始终如一地使用相同的LoaderManager 实现(无论是来自支持库还是来自官方Android SDK),我的观点仍然成立。尽管如此,我已将答案中的getLoaderManager 更改为getSupportLoaderManager
    • Activity 和 Fragment 生命周期不同步以及来自 android 开发者网站的文本:fragment 所在的 Activity 生命周期直接影响片段的生命周期,这样活动的每个生命周期回调都会导致每个片段的类似回调。例如,当 Activity 收到 onPause() 时,Activity 中的每个 Fragment 都会收到 onPause()。 ?
    • @Rabbott(你知道这是一回事,因为所有的 SherlockFragments/SherlockActivitys 都是 Fragment/Activity/FragmentActivity 的子类...... Jake Wharton 没有触及LoaderManagers at全部在实际库中……他只是从 Android SDK/support 库继承而来。
    • @Luksprog 我同意Activity“直接影响Fragment 的生命周期”。但是,这并不意味着它们彼此同步。例如,Activity 可以在FragmentonCreateonActivityCreated 方法之间的任何时间创建......没有办法确定。这就是为什么存在像onActivityCreated 这样的方法的原因......因为否则将无法知道底层ActivityonCreate 方法何时完成执行。
    【解决方案2】:

    与我的另一个问题一样.. 不应该强制刷新,并且在使用提供程序时,您可以让提供程序通知 contentresovler 更新。我有一个插入新照片的方法,该方法使用数据提供程序。数据提供者需要

    getContext().getContentResolver().notifyChange(uri, null);
    

    实际更新光标。

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多