我有一个活动,它在Sqlite DB上运行查询,获取Cursor,使用该Cursor创建CustomCursorAdapter,并将其附加到活动中的ListView。它看起来像这样:
SQLiteDatabase db=new StuffHelper(this).getWritableDatabase();
Cursor c1=db.query(StuffHelper.TABLE,
new String[]{StuffHelper._ID},
StuffHelper.SIZE+">=?",
new String[]{"64"},
null,
null,
null);
startManagingCursor(c1);
StuffAdapter a1 = new StuffAdapter(this, c1);
ListView ll1 = (ListView) findViewById(R.id.ll1);
ll1.setAdapter(a1);
这个当前的设置在ANR方面是个问题吗?使用游标时,如何告诉android在后台线程上运行所有Sqlite内容?
答案 0 :(得分:1)
您没有提供有关此代码运行时间的更多内容,但无论如何我都会咬人......
是的,它确实存在ANR的风险。它还存在各种其他生命周期问题的风险。由于setListAdapter()
需要在onCreate()
中通常执行的各种其他操作之前调用,因此您可能希望将数据库访问权限卸载到可以调用/缓存的单独线程(如AsyncTask)根据需要管理。 AsyncTask在线程启动之前为您提供基于UI的回调,在线程结束时为您提供基于UI的回调。 ListAdapter可以在没有任何Cursor引用的情况下创建和分配(我建议你尽快解决这个问题......似乎没有充分的理由说明你使用自定义列表适配器,你应该管理你的数据库访问更好了。)
通过活动拆除和重建来管理这项任务(想想改变方向......)是一个完全不同的蜡球,并且在SO上已经被覆盖了。
答案 1 :(得分:0)
请将您的UI与后台任务分开。在后台写入光标部分,在forground中可以显示任何UI或进度对话框。使用AsyncTask进行此
AsyncTask类有以下方法
1. doInBackground: Code performing long running operation goes in this method. When onClick method is executed on click of button, it calls execute method which accepts parameters and automatically calls doInBackground method with the parameters passed.
2. onPostExecute: This method is called after doInBackground method completes processing. Result from doInBackground is passed to this method.
3. onPreExecute: This method is called before doInBackground method is called.
4. onProgressUpdate: This method is invoked by calling publishProgress anytime from doInBackground call this method.
由于 迪帕克