android - 没有 ContentProvider 的 CursorLoader 使用

标签 android android-contentprovider android-cursorloader android-loadermanager

Android SDK 文档说 startManagingCursor() 方法已弃用:

This method is deprecated. Use the new CursorLoader class with LoaderManager instead; this is also available on older platforms through the Android compatibility package. This method allows the activity to take care of managing the given Cursor's lifecycle for you based on the activity's lifecycle. That is, when the activity is stopped it will automatically call deactivate() on the given Cursor, and when it is later restarted it will call requery() for you. When the activity is destroyed, all managed Cursors will be closed automatically. If you are targeting HONEYCOMB or later, consider instead using LoaderManager instead, available via getLoaderManager()

所以我想使用 CursorLoader。但是,当我需要 CursorLoader 的构造函数中的 URI 时,如何将它与自定义 CursorAdapter 和没有 ContentProvider 一起使用?

最佳答案

我写了一个 simple CursorLoader不需要内容提供者:

import android.content.Context;
import android.database.Cursor;
import android.support.v4.content.AsyncTaskLoader;

/**
 * Used to write apps that run on platforms prior to Android 3.0. When running
 * on Android 3.0 or above, this implementation is still used; it does not try
 * to switch to the framework's implementation. See the framework SDK
 * documentation for a class overview.
 *
 * This was based on the CursorLoader class
 */
public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> {
    private Cursor mCursor;

    public SimpleCursorLoader(Context context) {
        super(context);
    }

    /* Runs on a worker thread */
    @Override
    public abstract Cursor loadInBackground();

    /* Runs on the UI thread */
    @Override
    public void deliverResult(Cursor cursor) {
        if (isReset()) {
            // An async query came in while the loader is stopped
            if (cursor != null) {
                cursor.close();
            }
            return;
        }
        Cursor oldCursor = mCursor;
        mCursor = cursor;

        if (isStarted()) {
            super.deliverResult(cursor);
        }

        if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
            oldCursor.close();
        }
    }

    /**
     * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
     * will be called on the UI thread. If a previous load has been completed and is still valid
     * the result may be passed to the callbacks immediately.
     * <p/>
     * Must be called from the UI thread
     */
    @Override
    protected void onStartLoading() {
        if (mCursor != null) {
            deliverResult(mCursor);
        }
        if (takeContentChanged() || mCursor == null) {
            forceLoad();
        }
    }

    /**
     * Must be called from the UI thread
     */
    @Override
    protected void onStopLoading() {
        // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

    @Override
    public void onCanceled(Cursor cursor) {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }

    @Override
    protected void onReset() {
        super.onReset();

        // Ensure the loader is stopped
        onStopLoading();

        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        mCursor = null;
    }
}

它只需要 AsyncTaskLoader 类。 Android 3.0 或更高版本的,或者兼容包自带的。

我也是wrote a ListLoader它与 LoadManager 兼容,用于检索通用 java.util.List 集合。

关于android - 没有 ContentProvider 的 CursorLoader 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182485/

相关文章:

android - 重启 CursorLoader 不反射(reflect)数据库删除

android - 具有不同于 SQLite 模型类的自定义模型类的分页库 - Android

android - 运行 uiautomator 时,AccessibilityService 被销毁

android - 如何设置ListView的滚动条向右偏移

android - Image Picker Intent - 在线存储照片的空路径

android - Android CallLog.Calls TYPE 的意外值

android - SimpleCursorAdapter 的旧构造函数已弃用……真的吗?

android - 在 Android 上的 SQLite 中处理多个表 - 为什么这么复杂?

Android CursorLoader 不响应 ContentProvider 通知

android - 哪个更好 : Loader or Headless Fragments