使用 HttpClient 的致命异常错误
FATAL EXCEPTION Error using HttpClient
我想使用 JSON 并从网络获取数据。我找到了一个教程,然后应用了任何东西。结果令人沮丧。简要地说:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occurred while executing
doInBackground()
这是我的代码:
package com.example.winsekiz.searchlist;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
public class WebServer extends Activity {
final static String URI = "www.hocaogluticaret.com/a.html";
TextView tvData;
JSONObject json;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.turkey);
tvData = (TextView) findViewById(R.id.tv);
new Game().execute("text");
}
protected JSONObject readGameParks() throws ClientProtocolException, IOException, JSONException{
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(URI);
HttpResponse response =client.execute(get);
StatusLine status = response.getStatusLine();
int s = status.getStatusCode();
if(s == 200) {
HttpEntity e = response.getEntity();
String data = EntityUtils.toString(e);
JSONArray posts = new JSONArray(data);
JSONObject last = posts.getJSONObject(0);
}
return null;
}
public class Game extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
try{
json = readGameParks();
String data = json.getString(params[0]);
return data;
}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String data){
tvData.setText(data);
}
}
}
这是错误:
03-21 22:29:17.110 10922-10922/com.example.winsekiz.searchlist I/art: Not late-enabling -Xcheck:jni (already on)
03-21 22:29:17.120 10922-10922/com.example.winsekiz.searchlist W/System: ClassLoader referenced unknown path: /data/app/com.example.winsekiz.searchlist-2/lib/x86_64
03-21 22:29:17.130 10922-10935/com.example.winsekiz.searchlist D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
03-21 22:29:17.200 10922-10935/com.example.winsekiz.searchlist I/OpenGLRenderer: Initialized EGL, version 1.4
03-21 22:29:17.270 10922-10935/com.example.winsekiz.searchlist W/EGL_emulation: eglSurfaceAttrib not implemented
03-21 22:29:17.270 10922-10935/com.example.winsekiz.searchlist W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7feb1eea0e40, error=EGL_SUCCESS
03-21 22:29:18.910 10922-10944/com.example.winsekiz.searchlist E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.winsekiz.searchlist, PID: 10922
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.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.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.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=www.hocaogluticaret.com/a.html
at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:603)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:299)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at com.example.winsekiz.searchlist.WebServer.readGameParks(WebServer.java:47)
at com.example.winsekiz.searchlist.WebServer$Game.doInBackground(WebServer.java:68)
at com.example.winsekiz.searchlist.WebServer$Game.doInBackground(WebServer.java:62)
at android.os.AsyncTask.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.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)
03-21 22:29:18.990 10922-10935/com.example.winsekiz.searchlist W/EGL_emulation: eglSurfaceAttrib not implemented
03-21 22:29:18.990 10922-10935/com.example.winsekiz.searchlist W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7feb1d9ff2c0, error=EGL_SUCCESS
03-21 22:29:19.010 10922-10935/com.example.winsekiz.searchlist E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7feb2e2daa90
03-21 22:29:24.090 10922-10935/com.example.winsekiz.searchlist E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7feb2e2daf60
03-21 22:34:18.920 10922-10944/? I/Process: Sending signal. PID: 10922 SIG: 9
您的 url 不完整。
www.hocaogluticaret.com/a.html
应该是
http://www.hocaogluticaret.com/a.html
或
https://www.hocaogluticaret.com/a.html
让我们单步执行代码
1) 启动 AsyncTask
new Game().execute("text");
2) 转到 doInBackground
json = readGameParks();
3) 连接到非限定 URI
HttpGet get = new HttpGet("www.hocaogluticaret.com/a.html");
你得到一个错误,解决这个问题把 http://
放在地址前面。
4) 假设连接正确,继续 return null;
String data = json.getString(params[0]);
return data;
在这里,params[0]
是 "text",但是 json
是 null,因此抛出一个 NullPointerException
。
要修复,请尝试不在 readGameParks
中返回 null
。我认为您应该在状态代码检查中执行 return last;
。
在代码中,
JSONObject last = new JSONObject();
if(s == 200) {
HttpEntity e = response.getEntity();
String data = EntityUtils.toString(e);
JSONArray posts = new JSONArray(data);
last = posts.getJSONObject(0);
}
return last;
我想使用 JSON 并从网络获取数据。我找到了一个教程,然后应用了任何东西。结果令人沮丧。简要地说:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occurred while executing doInBackground()
这是我的代码:
package com.example.winsekiz.searchlist;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
public class WebServer extends Activity {
final static String URI = "www.hocaogluticaret.com/a.html";
TextView tvData;
JSONObject json;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.turkey);
tvData = (TextView) findViewById(R.id.tv);
new Game().execute("text");
}
protected JSONObject readGameParks() throws ClientProtocolException, IOException, JSONException{
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(URI);
HttpResponse response =client.execute(get);
StatusLine status = response.getStatusLine();
int s = status.getStatusCode();
if(s == 200) {
HttpEntity e = response.getEntity();
String data = EntityUtils.toString(e);
JSONArray posts = new JSONArray(data);
JSONObject last = posts.getJSONObject(0);
}
return null;
}
public class Game extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
try{
json = readGameParks();
String data = json.getString(params[0]);
return data;
}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String data){
tvData.setText(data);
}
}
}
这是错误:
03-21 22:29:17.110 10922-10922/com.example.winsekiz.searchlist I/art: Not late-enabling -Xcheck:jni (already on)
03-21 22:29:17.120 10922-10922/com.example.winsekiz.searchlist W/System: ClassLoader referenced unknown path: /data/app/com.example.winsekiz.searchlist-2/lib/x86_64
03-21 22:29:17.130 10922-10935/com.example.winsekiz.searchlist D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
03-21 22:29:17.200 10922-10935/com.example.winsekiz.searchlist I/OpenGLRenderer: Initialized EGL, version 1.4
03-21 22:29:17.270 10922-10935/com.example.winsekiz.searchlist W/EGL_emulation: eglSurfaceAttrib not implemented
03-21 22:29:17.270 10922-10935/com.example.winsekiz.searchlist W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7feb1eea0e40, error=EGL_SUCCESS
03-21 22:29:18.910 10922-10944/com.example.winsekiz.searchlist E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.winsekiz.searchlist, PID: 10922
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.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.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.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=www.hocaogluticaret.com/a.html
at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:603)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:299)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at com.example.winsekiz.searchlist.WebServer.readGameParks(WebServer.java:47)
at com.example.winsekiz.searchlist.WebServer$Game.doInBackground(WebServer.java:68)
at com.example.winsekiz.searchlist.WebServer$Game.doInBackground(WebServer.java:62)
at android.os.AsyncTask.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.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)
03-21 22:29:18.990 10922-10935/com.example.winsekiz.searchlist W/EGL_emulation: eglSurfaceAttrib not implemented
03-21 22:29:18.990 10922-10935/com.example.winsekiz.searchlist W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7feb1d9ff2c0, error=EGL_SUCCESS
03-21 22:29:19.010 10922-10935/com.example.winsekiz.searchlist E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7feb2e2daa90
03-21 22:29:24.090 10922-10935/com.example.winsekiz.searchlist E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7feb2e2daf60
03-21 22:34:18.920 10922-10944/? I/Process: Sending signal. PID: 10922 SIG: 9
您的 url 不完整。
www.hocaogluticaret.com/a.html
应该是
http://www.hocaogluticaret.com/a.html
或
https://www.hocaogluticaret.com/a.html
让我们单步执行代码
1) 启动 AsyncTask
new Game().execute("text");
2) 转到 doInBackground
json = readGameParks();
3) 连接到非限定 URI
HttpGet get = new HttpGet("www.hocaogluticaret.com/a.html");
你得到一个错误,解决这个问题把 http://
放在地址前面。
4) 假设连接正确,继续 return null;
String data = json.getString(params[0]);
return data;
在这里,params[0]
是 "text",但是 json
是 null,因此抛出一个 NullPointerException
。
要修复,请尝试不在 readGameParks
中返回 null
。我认为您应该在状态代码检查中执行 return last;
。
在代码中,
JSONObject last = new JSONObject();
if(s == 200) {
HttpEntity e = response.getEntity();
String data = EntityUtils.toString(e);
JSONArray posts = new JSONArray(data);
last = posts.getJSONObject(0);
}
return last;