在Android中的Doinbackground中获取错误

时间:2016-12-19 07:23:18

标签: android android-asynctask

下面是我的代码帮助我删除此错误试图建立一个天气应用程序帮助我的朋友,以便我可以将此应用程序显示为我的次要项目。没有错误显示在Android工作室,但当我按下我的按钮它显示下面的代码。

import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;``
import android.os.Bundle;
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.jso`enter code here`n.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {
EditText cityName;
TextView resultTextView;

public void findWeather(View view){

Log.i("cityName",cityName.getText().toString());

InputMethodManager mgr = (InputMethodManager) getSystemService    (Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(cityName.getWindowToken(),0);

    try {
        String encodedCityName = URLEncoder.encode(cityName.getText().toString(), "UTF-8");

     DownloadTask task = new DownloadTask();
     task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + encodedCityName);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(),"Could Not Find Weather",Toast.LENGTH_SHORT);
    }



}

@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);


}

public class DownloadTask extends AsyncTask<String,Void,String>{

    @Override
    protected String doInBackground(String... urls) {

    String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try {
            url = new URL(urls[0]);

            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream in = urlConnection.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 (Exception e) {

            Toast.makeText(getApplicationContext(),"Could Not Find Weather",Toast.LENGTH_SHORT);
        }


        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {

            String message = "";
            JSONObject jsonObject = new JSONObject(result);
           String weatherInfo= jsonObject.getString("weather");
            Log.i("Weather Content",weatherInfo);
            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 != ""){

                message += main + "; " + description + "\r\n";
               }
           }

            if (message != ""){

                resultTextView.setText(message);

            } else {

                Toast.makeText(getApplicationContext(),"Could Not Find Weather",Toast.LENGTH_SHORT);

            }


        } catch (JSONException e) {

  Toast.makeText(getApplicationContext(),"Could Not Find Weather",Toast.LENGTH_SHORT);
        }


    }


}

}

以下是错误帮助我的朋友

 java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                 at   android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                 at  java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                 at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                 at java.lang.Thread.run(Thread.java:818)
                                              Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called 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:345)
                                                 at android.widget.Toast.<init>(Toast.java:101)
                                                 at android.widget.Toast.makeText(Toast.java:259)
                                                 at com.example.shaarif.test3.MainActivity$DownloadTask.doInBackground(MainActivity.java:90)
                                                 at com.example.shaarif.test3.MainActivity$DownloadTask.doInBackground(MainActivity.java:64)
                                                 at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                 at java.lang.Thread.run(Thread.java:818) 

1 个答案:

答案 0 :(得分:0)

您无法通过doInBackground()方法为您的消息干杯。

尝试删除此行,然后尝试。

 Toast.makeText(getApplicationContext(),"Could Not Find Weather",Toast.LENGTH_SHORT);

并且如果必须显示来自doInBackground()方法的消息,请尝试使用处理程序或线程。

但是从doInBackground()执行UI转换尝试从onPostExecute()方法执行它是一种不好的做法。

相关问题