【问题标题】:Why does furthur execution halts after HttpResponse response=client.execute(request) line? [duplicate]为什么在 HttpResponse response=client.execute(request) 行之后进一步执行停止? [复制]
【发布时间】:2014-12-22 17:43:28
【问题描述】:
import java.io.BufferedReader; 
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.util.Log;

public class GetPostEx {

public String getInternetData() throws Exception{

    //String source_prog;
    //int lang_number;
    //BufferedReader in = null;
    String ret=null;
    try{

        HttpClient client = new DefaultHttpClient();
        HttpPost request = new HttpPost("Some server link");
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
        nameValuePairs.add(new BasicNameValuePair("source", "print 1"));
        nameValuePairs.add(new BasicNameValuePair("lang", "5"));
        nameValuePairs.add(new BasicNameValuePair("testcases", "[\"1\"]"));
        nameValuePairs.add(new BasicNameValuePair("api_key", "Some key"));
         request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        Log.e("error", "before HTTPResponse");
        HttpResponse response = client.execute(request);
        Log.e("error", "Aftr HTTPResponse");
        ret = EntityUtils.toString(response.getEntity());
        }catch (Exception e){
            //Log.e("error","error!!");
        e.printStackTrace();
    }
    return ret;
}

}  

在我调用 GetPostEx 类的其他活动 (AndroidHTTPRequestsActivity) 中使用的代码是:-

GetPostEx test = new GetPostEx();
    try{
        returned = test.getInternetData();
} catch(Exception e){ 
            Log.e("error", "yo") ;
            e.printStackTrace();
}

我正在尝试使用 API 制作一个需要来自服务器的一些 HTTP 响应的 android 应用程序。这是我用于获取 HTTP 响应的代码。但是在 HttpResponse response = client.execute(request ); logcat 在这一行之后没有显示错误,而上面的错误正在显示。 我无法弄清楚这背后的原因。

以下几行是 logcat 中的堆栈跟踪详细信息:-

12-22 14:18:58.658: E/error(1335): 在 HTTPResponse 之前

12-22 14:18:59.448: W/System.err(1335): android.os.NetworkOnMainThreadException

12-22 14:18:59.448: W/System.err(1335): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)

12-22 14:18:59.458: W/System.err(1335): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385)

12-22 14:18:59.458: W/System.err(1335): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)

12-22 14:18:59.458: W/System.err(1335): 在 java.net.InetAddress.getAllByName(InetAddress.java:214)

12-22 14:18:59.458: W/System.err(1335) : at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)

12-22 14:18:59.458: W/System.err(1335): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)

12-22 14:18:59.458: W/System.err(1335): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)

12-22 14:18:59.478: W/System.err(1335): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)

12-22 14:18:59.478: W/System.err(1335): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

12-22 14:18:59.478: W/System.err(1335): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)

12-22 14:18:59.478: W/System.err(1335): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

12-22 14:18:59.478: W/System.err(1335): at com.us.onlinecompilr.GetPostEx.getInternetData(GetPostEx.java:37)

12-22 14:18:59.478:W/System.err(1335):在 com.us.onlinecompilr.AndroidHTTPRequestsActivity.onCreate(AndroidHTTPRequestsActivity.java:29)

12-22 14:18:59.478: W/System.err(1335): 在 android.app.Activity.performCreate(Activity.java:5243)

12-22 14:18:59.478: W/System.err(1335): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)

12-22 14:18:59.478: W/System.err(1335): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)

12-22 14:18:59.488: W/System.err(1335): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)

12-22 14:18:59.488: W/System.err(1335): 在 android.app.ActivityThread.access$700(ActivityThread.java:135)

12-22 14:18:59.488: W/System.err(1335): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)

12-22 14:18:59.488: W/System.err(1335): 在 android.os.Handler.dispatchMessage(Handler.java:102)

12-22 14:18:59.488: W/System.err(1335): 在 android.os.Looper.loop(Looper.java:137)

12-22 14:18:59.488: W/System.err(1335): 在 android.app.ActivityThread.main(ActivityThread.java:4998)

12-22 14:18:59.488: W/System.err(1335): 在 java.lang.reflect.Method.invokeNative(Native Method)

12-22 14:18:59.488: W/System.err(1335): 在 java.lang.reflect.Method.invoke(Method.java:515)

12-22 14:18:59.488: W/System.err(1335): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)

12-22 14:18:59.488: W/System.err(1335): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)

12-22 14:18:59.488: W/System.err(1335): at dalvik.system.NativeStart.main(Native Method)

12-22 14:18:59.588:I/Choreographer(1335):跳过 641 帧!应用程序可能在其主线程上做了太多工作。

12-22 14:19:03.278:I/Choreographer(1335):跳过 33 帧!应用程序可能在其主线程上做了太多工作。

12-22 14:19:06.188:I/Choreographer(1335):跳过 112 帧!应用程序可能在其主线程上做了太多工作。

【问题讨论】:

  • 也尝试放置一个 catch 块
  • 好吧,我按照你说的修改了代码,还给出了堆栈跟踪详细信息。
  • 问题是你在主线程中进行网络调用。使用 AsyncTask 进行网络调用。见错误说 2-22 14:18:59.448: W/System.err(1335): android.os.NetworkOnMainThreadException

标签: android apache api http-response-codes


【解决方案1】:

你的错误很明显

2-22 14:18:59.448: W/System.err(1335): android.os.NetworkOnMainThreadException

这只是意味着您正在主线程(UI 线程)上进行网络调用。

使用 AsynTask 进行网络调用。看到这个http://developer.android.com/reference/android/os/AsyncTask.html

另一个很好的例子是http://www.javasrilankansupport.com/2012/11/asynctask-android-example-asynctask-in.html

【讨论】:

    【解决方案2】:

    可能发生在执行方法中抛出异常的情况。因此execute下面的Log语句不会被执行。

    我看到您已经为 Android 编写了这段代码。检查您的 MANIFEST 文件中是否具有 INTERNET 权限。 添加一个 catch 块并查看异常堆栈跟踪。

    【讨论】:

    • 我也这么觉得。但那该如何纠正呢?
    • 已经在 manifest 中添加了 INTERNET 权限。
    • 你需要添加堆栈跟踪,否则很难猜到问题。
    • 好吧,我按照你说的修改了代码,还给出了堆栈跟踪详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多