2013年12月12日

[Android] onLoadFinished()でDialogFragmentを表示する

データを読み込んで、ある条件に一致したらダイアログを表示しようと考え、以下のようなコードを書きました。
CursorLoaderを使ってデータを読み込んでいます。
条件を満たしていたら、onLoadFinished()でダイアログを表示します。
public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getApplication(), HOGE_URI, null, null, null, null);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// .. 何らかの処理 ..

DialogFragment fragment = new MyDialogFragment();
fragment.show(getSupportFragmentManager(), "dialog");
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
});
}
}

しかし、このコードを実行すると以下の例外が発生し、アプリがクラッシュしてしまいました。

java.lang.IllegalStateException: Can not perform this action inside of onLoadFinished

どうやら、onLoadFinished()内でダイアログを表示してはいけないようです。
UIスレッド以外でUIの操作をしてはいけないという制限によるものなのかと、ダイアログ表示部分を以下のように書き換えてみました。
runOnUiThread(new Runnable() {
@Override
public void run() {
DialogFragment fragment = new MyDialogFragment();
fragment.show(getSupportFragmentManager(), "dialog");
}
});

これもダメでした。同じ例外が発生してクラッシュしてしまいます。
インターネット上で検索してみると、Handlerを使えばうまくいくらしいことがわかりました。
以下のようにします。
handler.post(new Runnable() {
@Override
public void run() {
DialogFragment fragment = new MyDialogFragment();
fragment.show(getSupportFragmentManager(), "dialog");
}
});

これなら動きました。

イマイチよくわかりません。
時間があれば、もう少し調べてみたいところですが、今はちょっと忙しいのでここまで。

posted by t2low at 22:00| Android