【问题标题】:Pattern for querying the database asynchronously in getChildrenCursor() method of CursorTreeAdapter classCursorTreeAdapter 类的 getChildrenCursor() 方法中异步查询数据库的模式
【发布时间】:2012-10-25 14:02:15
【问题描述】:

我已经为从 CursorTreeAdapter 类扩展而来的 ExpandableListView 实现了一个自定义适配器。一切都按预期工作。

但我想知道在适配器类的getChildrenCursor() 方法中是否有关于如何异步查询数据库的模式或某种最佳实践。目前,我将 SQLiteOpenHelper 类传递给适配器的构造函数,并在getChildrenCursor() 中使用它在 UI 线程上同步查询数据库。

【问题讨论】:

    标签: android asynchronous expandablelistadapter


    【解决方案1】:

    您也可以使用 CursorLoader 而不是子类化 AsyncTask 来异步查询提供程序。

    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        if (id != -1) {
            // child cursor
            return new CursorLoader(getActivity(), childrenUri,
                    CHILDREN_PROJECTION, selection, selectionArgs, sortOrder);
        } else {
            // group cursor
            return new CursorLoader(getActivity(), groupsUri,
                    GROUPS_PROJECTION, selection, null, sortOrder);
        }
    
    }
    
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        int id = loader.getId();
        if (id != -1) {
            // child cursor
            if (!data.isClosed()) {
                try {
                    mAdapter.setChildrenCursor(id, data);
                } catch (NullPointerException e) {
                    Log.w("TAG",
                            "Adapter expired, try again on the next query: "
                                    + e.getMessage());
                }
            }
    
        } else {
            // group cursor
            mAdapter.setGroupCursor(data);
        }
    }
    
    public void onLoaderReset(Loader<Cursor> loader) {
        int id = loader.getId();
        if (id != -1) {
            // child cursor
            mAdapter.setChildrenCursor(id, null);
        } else {
            // group cursor
            mAdapter.setGroupCursor(null);
        }
    }
    

    在您的适配器类中,您可以像这样覆盖getChildrenCursor() 方法:

    protected Cursor getChildrenCursor(Cursor groupCursor) {
        // Given the group, we return a cursor for all the children within that group
        int id = groupCursor.getInt(groupCursor
                .getColumnIndex(ContactsContract.Groups._ID));
        mActivity.getLoaderManager().initLoader(id, null,mFragment);
        return null;
    }
    

    【讨论】:

    【解决方案2】:

    getChildrenCursor 说:

    如果你想异步查询一个 提供程序以防止阻塞 UI, 可以返回 null 并且在 稍后调用 setChildrenCursor(int, 光标)。

    因此,在 getChildrenCursor() 中,启动 AsyncTask 并返回 null。在onPostExecute()方法中调用setChildrenCursor()

    【讨论】:

    • 或者,您可以查看此文件:ApiDemos/src/com/example/android/apis/view/ExpandableList2.java(在 SDK 的示例中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2013-10-07
    • 2012-05-25
    • 2023-03-18
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多