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(); } }