AndroidRuntime:致命异常:AsyncTask#1进程



这是我试图运行的代码:

package com.harshs.whatstheweather;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
import java.lang.*;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class MainActivity extends AppCompatActivity {
EditText cityName;
TextView resultTextView;
public void findWeather(View view) {
Log.i("Button", cityName.getText().toString());
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromInputMethod(cityName.getWindowToken(), 0);
try {
Weather task = new Weather();
String encodedURL = URLEncoder.encode(cityName.getText().toString(), "UTF-8");
task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + encodedURL + "&appid=ecd9af9d7b34407890a8b4096b6b90e2");
} catch (Throwable e) {
Toast.makeText(getApplicationContext(), "Could not find the Weather", Toast.LENGTH_LONG);
}
}
class Weather extends AsyncTask < String, Void, String > {
@Override
protected String doInBackground(String...urls) {
String result = "";
URL url;
HttpURLConnection connection;
try {
url = new URL(urls[0]);
connection = (HttpURLConnection) url.openConnection();
InputStream in = connection.getInputStream();
InputStreamReader reader = new InputStreamReader( in );
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
} catch (Throwable e) {
Toast.makeText(getApplicationContext(), "Could not find the Weather", Toast.LENGTH_LONG);
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
String mess = "";
JSONObject jsonObject = new JSONObject(result);
String weatherInfo = jsonObject.getString("weather");
JSONArray arr = new JSONArray(weatherInfo);
for (int i = 0; i < arr.length(); i++) {
JSONObject jSonPart = arr.getJSONObject(i);
String main = "";
String description = "";

main = jSonPart.getString("main");
description = jSonPart.getString("description");
if (main != "" && description != "'") {
mess += main + ": " + description + "rn";
}
}
if (mess != "") {
resultTextView.setText(mess);
} else {
Toast.makeText(getApplicationContext(), "Could not find the Weather", Toast.LENGTH_LONG);
}
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Could not find the Weather", Toast.LENGTH_LONG);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cityName = (EditText) findViewById(R.id.cityName);
resultTextView = (TextView) findViewById(R.id.resultTextView);

}
}

我有一个正在构建的应用程序,但catch语句不起作用。每当出现异常时,应用程序就会崩溃,日志中就会出现以下错误,我不知道为什么。请帮忙!

错误如下:

致命异常:异步任务#1流程:com.harss.whattheweather,PID:1119java.lang.RuntimeException:执行时出错doInBackground((在android.os.AsyncTask$3.done(AsyncTask.java:318(在java.util.concurrent.FFutureTask.finishCompletion(FutureTask.java:354(位于java.util.concurrent.FFutureTask.setException(FutureTask.java:223(位于java.util.concurrent.FFutureTask.run(FutureTask.java:242(在android.os.AsyncTask$SerialExecutor$1.run上(AsyncTask.java:243(在java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1133(在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607(位于java.lang.Thread.run(Thread.java:761(引起原因:java.lang.RuntimeException:无法在内部创建处理程序未调用Looper.prepare((的线程在android.os.Handler上。(Handler.java:200(在android.os.Handler上。(Handler.java:114(在android.widget.TToast$TN.(Toast.java:346(在android.widget.Toast.(Toast.java:101(在android.widget.TToast.makeText(Toast.java:260(在com.harshs.whattheweather.MainActivity$Weather.doInBackground(MainActivity.java:85(在com.harshs.whattheweather.MainActivity$Weather.doInBackground(MainActivity.java:52(在android.os.AsyncTask$2.call上(AsyncTask.java:304(位于java.util.concurrent.FFutureTask.run(FutureTask.java:237(在android.os.AsyncTask$SerialExecutor$1.run上(AsyncTask.java:243(在java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1133(在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607(在java.lang.Thread.run(Thread.java:761(

请告诉我错误的含义。

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

您应该进行更多的调试,以了解错误的根本原因。通常,您可以在日志/堆栈跟踪中找到caused by行,这样您就可以知道代码的哪一部分导致了错误并修复它。

我认为这里的错误是你试图用doInBackground()方法制作Toast。尝试删除它,并在onPostExecute()中捕获异常/错误,然后从那里制作/显示Toast。doInBackground()不在UI线程中执行。如果要将AsyncTask类包装为Activity中的内部类,也可以尝试调用runOnUiThread()方法并从中生成/显示Toast。

希望这能有所帮助。

最新更新