从onLoadFinished()中的游标填充小部件

Cat*_*san 6 android android-cursorloader

我想知道如何使用它CursorLoader来填充屏幕上的小部件.在线的所有示例仅用于使用适配器,这非常有用.我需要的是一种可靠的方法来从Cursor和UI线程更新我的屏幕中的视图,而不会因为StaleDataException或者光标被突然停用而崩溃.这是我目前的方法,但我仍然收到用户的一些崩溃报告.

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        CursorLoader loader = null;

        switch (id) {
            case LOADER_ID_DATA:
                loader = new CursorLoader(...);
                break;
        }

        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, final Cursor cursor) {
        handler.post(new Runnable() {

            @Override
            public void run() {
                if (getActivity() == null)
                    return;

                updateView(cursor);
            }
        });
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
    }
Run Code Online (Sandbox Code Playgroud)

一种解决方案是直接在onLoadFinished中检索所有光标字段,并将它们全部传递给处理程序以填充UI线程上的窗口小部件.但这很难看,因为我可能在光标中有很多值.我很想找到一种可靠的无碰撞方式来处理这一切.

Pau*_*ond 7

在询问#android-dev之后SimonVT,readme帮助我了解了这一点.

没有任何东西onLoadFinished可以在UI线程上调用,所以理论上你应该使用HandlerReto书中建议的那样.但是,当使用a CursorLoader(这是迄今为止最常见的用例)时,您几乎可以保证onLoadFinished将在UI线程中调用它.

  • "非常多"的原因是CursorLoader使用AsyncTask来执行其后台工作,它使用静态处理程序进行回发,最终调用onLoadFinished.如果从主线程调用LoaderManager.initLoader(...),则保证处理程序也附加到主线程.要使此Handler不附加到主线程,您必须使用Looper创建一个Thread,并从那里启动Loader. (3认同)