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

Posted

技术标签:

【中文标题】AndroidRuntime:致命异常:AsyncTask #1 进程【英文标题】:AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process 【发布时间】:2020-08-11 09:28:16 【问题描述】:

这是我要运行的代码:

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 + "\r\n";
          
        
        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 语句不起作用。每当出现异常时,应用程序就会崩溃,并且日志中会出现以下错误,我不知道为什么。请帮忙!

这里是错误:

致命异常:AsyncTask #1 进程:com.harshs.whatstheweather,PID:11019 java.lang.RuntimeException:执行时发生错误 做背景() 在 android.os.AsyncTask$3.done(AsyncTask.java:318) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:223) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:761) 原因:java.lang.RuntimeException: Can't create handler inside 没有调用 Looper.prepare() 的线程 在 android.os.Handler.(Handler.java:200) 在 android.os.Handler.(Handler.java:114) 在 android.widget.Toast$TN.(Toast.java:346) 在 android.widget.Toast.(Toast.java:101) 在 android.widget.Toast.makeText(Toast.java:260) 在 com.harshs.whatstheweather.MainActivity$Weather.doInBackground(MainActivity.java:85) 在 com.harshs.whatstheweather.MainActivity$Weather.doInBackground(MainActivity.java:52) 在 android.os.AsyncTask$2.call(AsyncTask.java:304) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:761)

请告诉我错误的含义。

【问题讨论】:

【参考方案1】:

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。

希望这会有所帮助。

【讨论】:

非常感谢,我已经厌倦了在 doInBackground() 中制作吐司,但它仍然不起作用。

以上是关于AndroidRuntime:致命异常:AsyncTask #1 进程的主要内容,如果未能解决你的问题,请参考以下文章

E/AndroidRuntime:致命异常:Android 的 AsyncTask #1 错误

E / AndroidRuntime:致命异常:主PID:4435

E / AndroidRuntime:致命异常:Android的AsyncTask#1 ERROR

致命异常:TokenRefresher

AndroidRuntime:致命例外:androidmapsapi-ZoomTableManager

获得致命异常:使用 Async 类的 AsyncTask #1