Android:后台的SQLiteCursor / SimpleCursorAdapter

时间:2011-03-02 20:05:34

标签: android database multithreading 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);
        }
    }
 }

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

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

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

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

你能帮忙吗?感谢。

2 个答案:

答案 0 :(得分:5)

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

如果您还没有,请参见Painless Threading

答案 1 :(得分:0)

只需输入Looper.prepare();在引发此类错误的方法的顶部