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 时,如何在没有 ContentProvider 的情况下将其与自定义 CursorAdapter 一起使用?

最佳答案

我写了一个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/37949810/

相关文章:

无限循环中的android光标

android - Loader<Cursor> 只加载选定的行+下一行

android - CursorLoader,获取本地数据库的 URI

java - 使用 startActivityForResult() 调用时从相机返回

java - 从线程修改全局 ArrayList

android - 如何使用 CursorAdapter 和 LoaderCallbacks 在 fragment 中实现 ContentObserver?

android - Android 的自定义内容提供程序? (修改记事本示例)

android - Firebase 通知推送通知不工作

java - 从 Java 源代码创建 DEX 文件

android - Content Provider 在哪里存储数据?