Can’t create handler inside thread that has not called Looper.prepare()
表題のエラーでAndroidアプリが落ちてしまうことがあります。
UIスレッド以外から、Toastを使ったダイアログを表示していたためです。
そういう場合は、Handlerを使おうね!!という意味のエラーです。
私がやっていたのはこうでした。
public class GetRoadTask extends AsyncTask<ArrayList<GeoPoint>, Void, Road> {
//中略
protected Road doInBackground(ArrayList<GeoPoint>... params) {
// インターネット接続があるかどうか確認
ConnectivityManager cm = (ConnectivityManager) localContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nInfo = cm.getActiveNetworkInfo();
Road road = null;
if (nInfo == null) {
Toast.makeText(localContext, localContext.getString(R.string.no_network), Toast.LENGTH_LONG)
.show(); //これがダメ!
}else{
//この先ネットワークがあればする処理 …
}
return road;
}
}
気を利かせて、ネットワークがない場合は、その旨を表示しようと思っていたのですが、ダメ!!ですね。
この場合は、メインスレッドでコールバックを実装してonPostExecuteを実装していたので、そちらでroadがnullだったらメッセージを表示するように変更しました。
//RootDisplayActivity内
@Override
public void postGetRoadExecute(Road road) {
// プログレスダイアログを閉じる
if (m_ProgressDialog != null){
if(m_ProgressDialog.isShowing()) {
m_ProgressDialog.dismiss();
}
}
if(road != null){
//roadがあった時の処理
}else{
Toast.makeText(this, getString(R.string.cannot_get_root), Toast.LENGTH_LONG)
.show();
}
}
