我收到以下错误,但我不知道如何解决它 .
致命异常:OkHttp Dispatcher进程:com.aviato.android.aviato,PID:9042 java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.widget.Toast$TN.<init>(Toast.java:457)
at android.widget.Toast.<init>(Toast.java:119)
at android.widget.Toast.makeText(Toast.java:286)
at com.aviato.android.aviato.ui.BubblesActivity$2.onFailure(BubblesActivity.java:377)
at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:175)
at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
似乎错误出现在代码的这一部分(我在runOnUiThread中猜测):
@Override
public void onResponse(Response response) throws IOException {
try {
String jsonData = response.body().string();
Log.v(TAG, jsonData);
if (response.isSuccessful()) {
final String transportationValue = getTransportationValue(jsonData);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(BubblesActivity.this,
transportationValue,
Toast.LENGTH_SHORT).show();
updateDisplay(transportationValue);
}
});
} else {
alertUserAboutError();
}
} catch (IOException e) {
Log.e(TAG, "Exception caught: ", e);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
private String getTransportationValue(String jsonData) throws JSONException {
JSONObject response = new JSONObject(jsonData);
String status = response.getString("status");
int counter = 0;
if (status.equals("OK")) {
// It returned a good result. Keep going...
JSONArray routes = response.getJSONArray("routes");
for (int i = 0; i < routes.length(); i++) {
JSONObject currentRoute = routes.getJSONObject(i);
JSONArray legs = currentRoute.getJSONArray("legs");
for (int j = 0; j < legs.length(); j++) {
JSONObject currentLeg = legs.getJSONObject(i);
JSONObject duration = currentLeg.getJSONObject("duration");
counter += duration.getInt("value");
}
}
} else {
return "No";
}
return counter + "";
}
private void updateDisplay(String data) {
mTransportValue.setText(data);
}