作为一个初学者,我正在跟随一个关于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);
}
}
}
很抱歉发了这么长的邮件。 谢了。
应用程序崩溃,因为API没有返回任何东西,因为您没有指定API key
,如文档所示https://openweathermap.org/faq#error401,https://openweathermap.org/appid
您的错误基本上是抱怨一个null或空字符串。 您的URL返回一个401错误,这解释了为什么您的字符串没有按预期填充。 因此,为了避免类似的崩溃或错误,在您的日志之前,尝试检查字符串结果是否包含某些内容。