我有一个返回数千行的 SQLite 查询,我想使用ListView.
为了保持我的 UI 线程响应,我ListAdapter在后台线程上创建。
然而,花费最多时间(并且可能导致 ANR)的语句是ListActivity.setListAdapter我必须在 UI 线程上执行的......有什么建议吗?
公共类 CursorTestActivity 扩展 ListActivity {
私有静态最终字符串 LOGTAG = "DBTEST";
私有数据库管理器 mDbManager;
私人光标 mCursor;
私有处理线程 mIOWorkerThread;
私有处理程序 mIOHandler;
私有处理程序 mUIHandler;
@覆盖
公共无效 onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbManager = new DatabaseManager(this);
mUIHandler = 新的处理程序();
createIOWorkerThread();
log("创建光标");
mCursor = mDbManager.getCursor(); // 执行 db.query(...)
开始管理光标(mCursor);
mIOHandler.post(new Runnable() {
@覆盖
公共无效运行(){
setMyListAdapter();
}
});
log("onCreate 完成");
}
私人无效 setMyListAdapter() {
log("构造适配器");
// CustomCursorAdapter 实现 bindView 和 newView
final CustomCursorAdapter listAdapter = new CustomCursorAdapter(this,
mCursor,假);
log("完成构建适配器");
mUIHandler.post(new Runnable() {
@覆盖
公共无效运行(){
log("设置列表适配器");
设置列表适配器(列表适配器);// 返回的行越多越慢
log("设置内容视图");
设置内容视图(R.layout.main);
log("完成设置内容视图");
}
});
}
私人无效createIOWorkerThread(){
mIOWorkerThread = new HandlerThread("io_thread");
mIOWorkerThread.start();
Looper looper = mIOWorkerThread.getLooper();
mIOHandler = new Handler(looper);
}
私人无效destroyIOWorkerThread(){
如果(mIOWorkerThread == null)
返回;
Looper looper = mIOWorkerThread.getLooper();
if (looper != null) {
looper.quit();
}
}
@覆盖
公共无效 onDestroy() {
super.onDestroy();
如果(mDbManager != null)
mDbManager.close();
destroyIOWorkerThread();
}
私有静态无效日志(字符串 s){
Log.d(LOGTAG, s);
}
}