提问者:小点点

应用程序在onPostExecute方法中赋值时崩溃


作为一个初学者,我正在跟随一个关于andriod Studio的JSON演示(使用完全相同的代码和相同的版本)的讲座。 由于某种原因,每当我在onPostExecute方法中添加一些内容时,该应用程序就会在模拟器中崩溃。 例如,它不会因为以下代码而崩溃:

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

但当我添加非常基本的内容时,它会崩溃,以在日志中看到如下结果:

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.i("Website Content: ", result);

    }

我不知道这里出了什么问题。 为了内存分配,我试着重启Android Studio,我的互联网打开了,它在gradle控制台中调试得很好,但是在Android Monitor中给出了这样的结果:

null

06-27 19:16:35.201 18116-18157/com.example.rushi.jsondemo V/RenderScript: 0xae53b000 Launching thread(s), CPUs 2
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err: java.io.FileNotFoundException: http://api.openweathermap.org/data/2.5/weather?q=London,uk
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at com.example.rushi.jsondemo.MainActivity$DownloadTask$override.doInBackground(MainActivity.java:44)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at com.example.rushi.jsondemo.MainActivity$DownloadTask$override.access$dispatch(MainActivity.java)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at com.example.rushi.jsondemo.MainActivity$DownloadTask.doInBackground(MainActivity.java:0)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at com.example.rushi.jsondemo.MainActivity$DownloadTask.doInBackground(MainActivity.java:30)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
06-27 19:16:35.396 18116-19529/com.example.rushi.jsondemo W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
06-27 19:16:35.411 18116-19529/com.example.rushi.jsondemo W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
06-27 19:16:35.411 18116-19529/com.example.rushi.jsondemo W/System.err:     at java.lang.Thread.run(Thread.java:818)
06-27 19:16:35.451 18116-18116/com.example.rushi.jsondemo D/AndroidRuntime: Shutting down VM
06-27 19:16:35.529 18116-18116/com.example.rushi.jsondemo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.example.rushi.jsondemo, PID: 18116
                                                                            java.lang.NullPointerException: println needs a message
                                                                                at android.util.Log.println_native(Native Method)
                                                                                at android.util.Log.i(Log.java:160)
                                                                                at com.example.rushi.jsondemo.MainActivity$DownloadTask$override.onPostExecute(MainActivity.java:74)
                                                                                at com.example.rushi.jsondemo.MainActivity$DownloadTask$override.access$dispatch(MainActivity.java)
                                                                                at com.example.rushi.jsondemo.MainActivity$DownloadTask.onPostExecute(MainActivity.java:0)
                                                                                at com.example.rushi.jsondemo.MainActivity$DownloadTask.onPostExecute(MainActivity.java:30)
                                                                                at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                                                at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                                at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-27 19:19:47.263 18116-18122/com.example.rushi.jsondemo W/art: Suspending all threads took: 7.513ms
06-27 19:21:35.896 18116-18116/com.example.rushi.jsondemo I/Process: Sending signal. PID: 18116 SIG: 9

null

下面是我的完整代码:

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

    }

    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 (MalformedURLException e) {
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.i("Website Content: ", result);

        }

    }

}

很抱歉发了这么长的邮件。 谢了。


共2个答案

匿名用户

应用程序崩溃,因为API没有返回任何东西,因为您没有指定API key,如文档所示https://openweathermap.org/faq#error401,https://openweathermap.org/appid

匿名用户

您的错误基本上是抱怨一个null或空字符串。 您的URL返回一个401错误,这解释了为什么您的字符串没有按预期填充。 因此,为了避免类似的崩溃或错误,在您的日志之前,尝试检查字符串结果是否包含某些内容。