HTTP不能在Android模拟器工作 [英] HTTP doesn't work in Android emulator

查看:137
本文介绍了HTTP不能在Android模拟器工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试过多个HTTP类(的HttpURLConnection 了HTTPClient 等),但他们没有在模拟器上工作。然后,我决定来测试我的手机上,效果不错!

那么,如何才能解决这个奇怪的行为Android模拟器中的HTTP类不工作(而浏览器可以工作)?他们崩溃的应用程序都没有。

下面是我的code:

 公共静态的SimpleXML GETRESPONSE(串动,地图<字符串,字符串> PARAMS){
     //创建一个新的HttpClient和门柱头球
    HttpClient的HttpClient的=新DefaultHttpClient();
    HttpPost httppost =新HttpPost(动作);

    尝试 {
        //添加数据
        名单<的NameValuePair> namevaluepairs中=新的ArrayList<的NameValuePair>(params.size());
        对于(Map.Entry的<字符串,字符串>嘿:params.entrySet())
            nameValuePairs.add(新BasicNameValuePair(heh.getKey(),heh.getValue()));
        httppost.setEntity(新UrlEn codedFormEntity(namevaluepairs中));

        //执行HTTP POST请求
        HTT presponse响应= httpclient.execute(httppost);
        返回SimpleXML.loadXml(response.getEntity()的getContent());

    }赶上(ClientProtocolException E){
        返回null;
    }赶上(IOException异常E){
        返回null;
    }
}
 

LogCat中的日志:

  06-30 22:07:28.972:E / AndroidRuntime(682):致命异常:主要
06-30 22:07:28.972:E / AndroidRuntime(682):android.os.NetworkOnMainThreadException
06-30 22:07:28.972:E / AndroidRuntime(682):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
06-30 22:07:28.972:E / AndroidRuntime(682):在java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-30 22:07:28.972:E / AndroidRuntime(682):在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-30 22:07:28.972:E / AndroidRuntime(682):在java.net.InetAddress.getAllByName(InetAddress.java:214)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-30 22:07:28.972:E / AndroidRuntime(682):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
06-30 22:07:28.972:E / AndroidRuntime(682):在net.ekvium.air.API.getResponse(API.java:98)
06-30 22:07:28.972:E / AndroidRuntime(682):在net.ekvium.air.MainActivity $ 1.onClick(MainActivity.java:62)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.view.View.performClick(View.java:4084)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.view.View $ PerformClick.run(View.java:16966)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.os.Handler.handleCallback(Handler.java:615)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.os.Handler.dispatchMessage(Handler.java:92)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.os.Looper.loop(Looper.java:137)
06-30 22:07:28.972:E / AndroidRuntime(682):在android.app.ActivityThread.main(ActivityThread.java:4745)
06-30 22:07:28.972:E / AndroidRuntime(682):在java.lang.reflect.Method.invokeNative(本机方法)
06-30 22:07:28.972:E / AndroidRuntime(682):在java.lang.reflect.Method.invoke(Method.java:511)
06-30 22:07:28.972:E / AndroidRuntime(682):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
06-30 22:07:28.972:E / AndroidRuntime(682):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-30 22:07:28.972:E / AndroidRuntime(682):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

如果你看一下这个Android文档,它解释

NetworkOnMainThreadException:

  

的异常当应用程序试图执行时引发   联网运行其主线程。

     

这是只抛出针对蜂窝SDK或应用程序   更高。针对早期SDK版本的应用程序可以做   网络对他们的主事件循环线程,但它的高度   气馁。

因此​​,根据操作系统版本,有可能是你没有使UI线程上网络请求的政策执行(异常抛出)。这可以解释为什么你的code工作的设备上,而不是在一个仿真器(如果他们有不同的Andr​​oid版本)。

您的可以的修改 ThreadPolicy 。但作为一种替代方法,我建议你再看看在Android文档的声明。他们的阻止执行主线程网络运营,我当然同意。

所以,而不是改变政策的使其合法的,你可能会考虑改变你的code,让你的 GETRESPONSE()方法不叫UI线程上。

通常情况下,你可以使用的AsyncTask做背景的工作。

I tried multiple HTTP classes (HttpURLConnection, HTTPClient and others) but they don't work in emulator. Then I decided to test that on my phone and it worked well!

So how can I fix this strange behaviour of Android emulator that HTTP classes don't work (while browser can work)? They crash an application at all.

Here is my code:

public static SimpleXML getResponse(String action, Map<String, String> params) {
     // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(action);

    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(params.size());
        for(Map.Entry<String, String> heh : params.entrySet())
            nameValuePairs.add(new BasicNameValuePair(heh.getKey(), heh.getValue()));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        return SimpleXML.loadXml(response.getEntity().getContent());       

    } catch (ClientProtocolException e) {
        return null;
    } catch (IOException e) {
        return null;
    }   
}

LogCat log:

06-30 22:07:28.972: E/AndroidRuntime(682): FATAL EXCEPTION: main
06-30 22:07:28.972: E/AndroidRuntime(682): android.os.NetworkOnMainThreadException
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
06-30 22:07:28.972: E/AndroidRuntime(682):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-30 22:07:28.972: E/AndroidRuntime(682):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-30 22:07:28.972: E/AndroidRuntime(682):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-30 22:07:28.972: E/AndroidRuntime(682):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
06-30 22:07:28.972: E/AndroidRuntime(682):  at net.ekvium.air.API.getResponse(API.java:98)
06-30 22:07:28.972: E/AndroidRuntime(682):  at net.ekvium.air.MainActivity$1.onClick(MainActivity.java:62)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.view.View.performClick(View.java:4084)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.view.View$PerformClick.run(View.java:16966)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.os.Handler.handleCallback(Handler.java:615)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.os.Looper.loop(Looper.java:137)
06-30 22:07:28.972: E/AndroidRuntime(682):  at android.app.ActivityThread.main(ActivityThread.java:4745)
06-30 22:07:28.972: E/AndroidRuntime(682):  at java.lang.reflect.Method.invokeNative(Native Method)
06-30 22:07:28.972: E/AndroidRuntime(682):  at java.lang.reflect.Method.invoke(Method.java:511)
06-30 22:07:28.972: E/AndroidRuntime(682):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-30 22:07:28.972: E/AndroidRuntime(682):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-30 22:07:28.972: E/AndroidRuntime(682):  at dalvik.system.NativeStart.main(Native Method)

解决方案

If you look at this Android documentation, it explains

NetworkOnMainThreadException:

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.

So, depending on OS version, there may be enforcement (exception throwing) of the policy that you not make network requests on the UI thread. This could explain why your code works on a device, and not on an emulator (if they have different Android versions).

You could change the ThreadPolicy. But as an alternative, I'd suggest you look again at the statement in the Android docs. They heavily discourage performing network operations on the main thread, and I'd certainly agree with them.

So, rather than changing the policy to make it legal, you might consider changing your code, so that your getResponse() method is not called on the UI thread.

Typically, you would use AsyncTask to do the work in the background.

这篇关于HTTP不能在Android模拟器工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆