【问题标题】:DefaultHttpClient AsyncTask class timeout exceptionsDefaultHttpClient AsyncTask 类超时异常
【发布时间】:2013-10-10 06:55:14
【问题描述】:

这是我的AsyncTask 班级:

公共类 JSONParser 扩展 AsyncTask { 公共接口 MyCallbackInterface { public void onRequestComplete(JSONObject 结果); } 私有 MyCallbackInterface mCallback; 公共 JSONParser(MyCallbackInterface 回调) { mCallback = 回调; 上下文上下文 = (上下文) 回调; } 公共 JSONObject getJSONFromUrl(字符串 url){ // 发出 HTTP 请求 DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpPost = new HttpGet(url); HttpResponse getResponse = null; 最终的 HttpParams httpParameters = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 10 * 10000); HttpConnectionParams.setSoTimeout (httpParameters, 10 * 10000); 尝试 { getResponse = httpClient.execute(httpPost); } 捕捉(ClientProtocolException e2){ e2.printStackTrace(); } 捕捉(IOException e2){ e2.printStackTrace(); } 最终 int statusCode = getResponse.getStatusLine().getStatusCode(); 如果(状态代码!= HttpStatus.SC_OK){ Log.w(getClass().getSimpleName(), "错误" + statusCode + " for URL " + url); 返回空值; } HttpEntity getResponseEntity = getResponse.getEntity(); 字符串 json = null; 尝试 { json = EntityUtils.toString(getResponseEntity); } 捕捉(ParseException e1){ e1.printStackTrace(); } 捕捉(IOException e1){ e1.printStackTrace(); } JSONObject jObj = null; // 尝试将字符串解析为 JSON 对象 尝试 { jObj = 新的 JSONObject(json); } 捕捉(JSONException e){ Log.e("JSON Parser", "解析数据出错" + e.toString()); } // 返回 JSON 字符串 返回 obj; } @覆盖 受保护的 JSONObject doInBackground(String...params) { 字符串 url = 参数 [0]; 返回 getJSONFromUrl(url); } @覆盖 受保护的无效 onPostExecute(JSONObject 结果){ mCallback.onRequestComplete(结果); } }

我在 UI(RegisterActivity extends Activity implements MyCallbackInterface 类)中得到 JSON 答案:

公共类 RegisterActivity 扩展 Activity 实现 MyCallbackInterface{ ... @覆盖 公共无效 onRequestComplete(JSONObject json) { //租用解析并显示json ...

我从同一个 UI 调用 JSONParser(类 RegisterActivity extends Activity implements MyCallbackInterface

JSONParser mJSONParser1 = new JSONParser(context111);
mJSONParser1.execute(SERVER_URL+"?method=registration&user="+user+"&pass="+pass+"&regId="+regId);

例外情况:

10-03 15:58:02.303: W/System.err(22414): java.net.SocketException: 连接超时 10-03 15:58:02.350: W/System.err(22414): at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method) 10-03 15:58:02.366: W/System.err(22414): 在 dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.getJSONFromUrl(JSONParser.java:72) 10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:121) 10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:1) 10-03 15:58:02.366: W/System.err(22414): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-03 15:58:02.374: W/System.err(22414): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-03 15:58:02.374: W/System.err(22414): 在 java.lang.Thread.run(Thread.java:1019) 10-03 15:58:02.374: W/dalvikvm(22414): threadid=9: 线程以未捕获的异常退出 (group=0x40018560) 10-03 15:58:02.374:E/AndroidRuntime(22414):致命异常:AsyncTask #1 10-03 15:58:02.374: E/AndroidRuntime(22414): java.lang.RuntimeException: 执行 doInBackground() 时出错 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 android.os.AsyncTask$3.done(AsyncTask.java:200) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:125) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.lang.Thread.run(Thread.java:1019) 10-03 15:58:02.374:E/AndroidRuntime(22414):由:java.lang.NullPointerException 引起 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.getJSONFromUrl(JSONParser.java:81) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:121) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:1) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-03 15:58:02.374: E/AndroidRuntime(22414): ... 4 更多

我可以通过互联网访问服务器。 它适用于 samsung s2(android 4.1.2),但适用于摩托罗拉(android 2.3.3)。

欢迎任何想法。

我认为问题出在异步任务上......但是......没有更多的帮助。

PP php 服务器向请求(php 日志)返回写入答案,但应用无法获取。

【问题讨论】:

  • 您在getJasonFromUrl 方法中的81 行中获得了NullPointerException,找出为什么它为空
  • 我不知道这是为什么
  • 我要么不是我的代码,我什至不知道第 81 行是什么

标签: java android android-asynctask httpclient


【解决方案1】:

上面的答案是正确的,但是出于安全考虑,您应该使用 POST 而不是 GET

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("SERVER_URL");
httpPost.setEntity(new UrlEncodedFormEntity(params));

并像这样设置参数

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("email", email));

对于 GET 与 POST here 有很好的争论

【讨论】:

    【解决方案2】:

    JSONParser mJSONParser1 = new JSONParser(context111); mJSONParser1.execute(SERVER_URL+"?method=registration&user="+user+"&pass="+pass+"®Id="+regId) 是拼写错误还是直接剪切/粘贴? “Id=”位旁边有一些不寻常的字符。

    而且你确实有导致 null 的代码行,那么为什么它是 null(正如 tyczj 指出的那样)

    【讨论】:

    • JSONParser mJSONParser1 = new JSONParser(context111); mJSONParser1.execute(SERVER_URL+"?method=registration&user="+user+"&pass="+pass+"&regId="+regId); -> 这是真正的代码,我不知道为什么会有不寻常的字符......我认为错误的粘贴
    • 而且你确实有导致 null 的代码行 -> 我该怎么做以及我在 java 中的新位置
    猜你喜欢
    • 2013-04-11
    • 2011-11-05
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多