を使用して視覚化したい数千行を返す SQLite クエリがありますListView。
UI スレッドの応答性を維持するためListAdapterに、バックグラウンド スレッドで を作成します。
ただし、最も時間がかかる (そして ANR を引き起こす可能性がある) ステートメントはListActivity.setListAdapter、UI スレッドで実行する必要があるステートメントです...何かアドバイスはありますか?
public class CursorTestActivity extends ListActivity {
private static final String LOGTAG = "DBTEST";
プライベート DatabaseManager mDbManager;
プライベート Cursor mCursor;
プライベート HandlerThread mIOWorkerThread;
プライベート ハンドラ mIOHandler;
プライベート ハンドラ mUIHandler;
@オーバーライド
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbManager = 新しい DatabaseManager(this);
mUIHandler = 新しいハンドラー();
createIOWorkerThread();
log("カーソルを作成中");
mCursor = mDbManager.getCursor(); // db.query(...) を実行します
startManagingCursor(mCursor);
mIOHandler.post(new Runnable() {
@オーバーライド
public void run() {
setMyListAdapter();
}
});
log("onCreate 完了");
}
プライベートボイドsetMyListAdapter(){
log("アダプタの構築");
// CustomCursorAdapter は bindView と newView を実装します
final CustomCursorAdapter listAdapter = new CustomCursorAdapter(this,
mCursor、false);
log("アダプタの構築が完了しました");
mUIHandler.post(new Runnable() {
@オーバーライド
public void run() {
log("設定一覧アダプタ");
setListAdapter(listAdapter); // 返される行が増えるほど遅くなります
log("設定内容表示");
setContentView(R.layout.main);
log("コンテンツビューの設定完了");
}
});
}
プライベートボイド createIOWorkerThread() {
mIOWorkerThread = new HandlerThread("io_thread");
mIOWorkerThread.start();
ルーパー looper = mIOWorkerThread.getLooper();
mIOHandler = new Handler(ルーパー);
}
private void destroyIOWorkerThread() {
if (mIOWorkerThread == null)
戻る;
ルーパー looper = mIOWorkerThread.getLooper();
if (ルーパー != null) {
looper.quit();
}
}
@オーバーライド
public void onDestroy() {
super.onDestroy();
もし (mDbManager != null)
mDbManager.close();
destroyIOWorkerThread();
}
プライベート スタティック ボイド ログ(文字列 s) {
Log.d(LOGTAG, s);
}
}