2011年10月4日火曜日

Android AsyncQueryHandler を使う

UI スレッド上で getContentResolver().query() とかをすると、処理が重たい場合にスレッドをブロックしてしまって ANR になることもあるので、別スレッドで非同期に query() するための AsyncQueryHandler というクラスがあります。

AsyncQueryHandler は abstract クラスなので、継承したクラスを作って、onQueryComplete()onQueryInsertComplete() を Override し、ここで Adapter に Cursor をセットします。
こんな感じで使います。

public class AsyncQueryHandlerSampleActivity extends ListActivity { private static final String[] PHONE_PROJECTION = new String[] { Phone._ID, Phone.TYPE, Phone.NUMBER }; private static final int COLUMN_TYPE = 1; private static final int[] COLOR_LIST = new int[] { Color.parseColor("#002A42"), Color.parseColor("#3DC3EA"), Color.parseColor("#99417B"), Color.parseColor("#F2AE30"), Color.parseColor("#F2D338"), }; public class CustomAsyncQueryHandler extends AsyncQueryHandler { public CustomAsyncQueryHandler(ContentResolver cr) { super(cr); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { super.onQueryComplete(token, cookie, cursor); SimpleCursorAdapter adapter = new SimpleCursorAdapter( AsyncQueryHandlerSampleActivity.this, android.R.layout.simple_list_item_2, cursor, new String[] { Phone.TYPE, Phone.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if (columnIndex == COLUMN_TYPE) { int type = cursor.getInt(COLUMN_TYPE); String text = (String) Phone.getTypeLabel(getResources(), type, null); ((TextView) view).setText(text); ((TextView) view).setTextColor(COLOR_LIST[type % 5]); return true; } return false; } }); setListAdapter(adapter); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CustomAsyncQueryHandler asyncQueryHandler = new CustomAsyncQueryHandler(getContentResolver()); asyncQueryHandler.startQuery( 0, // token null, // cookie Phone.CONTENT_URI, PHONE_PROJECTION, // projection null, // selection null, // selectionArgs null // orderBy ); } }

0 件のコメント:

コメントを投稿