Android:后台的SQLiteCursor/SimpleCursorAdapter

Jar*_*rek 3 database multithreading android background adapter

我的问题与Android有关.我有以下代码(省略了非相关部分):

public class MyActivity extends ListActivity {
    protected void onResume() {
        super.onResume();
        new UpdateTask().execute();
    }

    private class UpdateTask extends AsyncTask<Object, Object, ListAdapter> {
        protected ListAdapter doInBackground(Object... params) {
            SQLiteCursor cursor = db.getSomeData();
            startManagingCursor(cursor);
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, ..., cursor, ..., ...);
            return adapter;
        }

        protected void onPostExecute(ListAdapter result) {
            listView.setAdapter(result);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

这会导致RuntimeException - "无法在实例化SimpleCursorAdapter的行中创建未调用Looper.prepare()的线程内的处理程序".

我理解为什么会发生这种情况,我只是不知道如何修复它(将它保存在一个单独的线程中).我找到了这个帖子:

http://groups.google.com/group/android-developers/browse_thread/thread/34d0069bb2de925e?fwc=2

但我真的不明白答复.我没有谷歌任何涉及SQLiteCursor和AsyncQueryHandler的例子.

你能帮忙吗?谢谢.

RTS*_*lio 5

看起来像SimpleCursorAdapter在UI线程上实例化必须发生的事情.您可以通过doInBackground()返回cursor并设置适配器来实现onPostExecute().

如果您还没有,请参阅无痛线程.

  • 我认为一旦返回光标就会完成初始查询,即使适配器有很多记录,适配器也不会停止.现在,[Javadocs](http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html)显示在Simple Level 11中不推荐使用`SimpleCursorAdapter`构造函数,因为_requerying_会在UI线程上发生,当底层内容广播变化时.如果你正在开发一个早期的API,看起来你必须忍受在UI线程上的requerying,或者你自己的`ResourceCursorAdapter`. (3认同)