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");
}
});
これなら動きました。
イマイチよくわかりません。
時間があれば、もう少し調べてみたいところですが、今はちょっと忙しいのでここまで。