DefaultHttpClient到AndroidHttpClientDefaultHttpClient、AndroidHttpClient

2023-09-11 12:00:45 作者:明知做戏

我有我的code问题,我希望一些帮助。 我先用这code:

 新DefaultHttpClient()。执行(新HTTPGET(linkk))。getEntity()的writeTo(
           新的FileOutputStream(F));
 

和它只是罚款在Android 2.3,但在4.0事实并非如此。经过一番研究,我听说是更好地使用AndroidHttpClient而这样一来,将工作在4.0和3.1。问题是,我不知道我是否已经正确地修改了code,有没有关于AndroidhttpClient在互联网上的例子太多了。

下面是我的code的调整:

  AndroidHttpClient客户端= AndroidHttpClient.newInstance(机器人);
    HTTPGET请求=新HTTPGET(linkk);
    HTT presponse响应= client.execute(要求); //这里是抛出异常
    response.getEntity()的writeTo(新的FileOutputStream(F))。
 
关于导入import org.apache.commons.httpclient.HttpClient 一直报错的原因

这是什么logcat中显示:

  1月1日至3号:32:11.950:W / dalvikvm(17991):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40a2e1f8)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):致命异常:主要
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.lacra.fbirthdays / com.lacra.fbirthdays.ListV}:android.os.NetworkOnMainThreadException
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.app.ActivityThread.access $ 600(ActivityThread.java:123)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.os.Handler.dispatchMessage(Handler.java:99)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.os.Looper.loop(Looper.java:137)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.app.ActivityThread.main(ActivityThread.java:4424)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在java.lang.reflect.Method.invokeNative(本机方法)
     1月1日至3日:32:11.986:E / AndroidRuntime(17991):在java.lang.reflect.Method.invoke(Method.java:511)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在dalvik.system.NativeStart.main(本机方法)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):由:android.os.NetworkOnMainThreadException
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在java.net.InetAddress.getAllByName(InetAddress.java:220)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    1月1日至3日:32:11.986:E / AndroidRuntime(17991):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
 

解决方案

StrictMode.ThreadPolicy由于API等级9,默认的线程策略,因为API级别11,这在短,不允许网络运行已经改变被引进(包括HttpClient的和的HttpURLConnection)获得UI线程上执行。如果你这样做,你会得到NetworkOnMainThreadException。

这限制是可以改变的,使用:

 如果(android.os.Build.VERSION.SDK_INT> 9){
      。StrictMode.ThreadPolicy政策=新StrictMode.ThreadPolicy.Builder()permitAll()建();
      StrictMode.setThreadPolicy(政策);
    }
 

添加上述code到您的主要活动的onCreate()方法。

此外, 始终建议移动网络运营关闭UI线程的,例如,使用AsyncTask的。

希望这种帮助。

I have a problem with my code and I was hoping for some help. I was firstly using this code :

        new DefaultHttpClient().execute(new HttpGet(linkk)).getEntity().writeTo(
           new FileOutputStream(f));

And it works just fine on android 2.3 but on 4.0 it doesn't. After some research, I hear that is better to use AndroidHttpClient and this way it will work on 4.0 and 3.1. The problem is that I do not know whether I have modified my code correctly and there aren't too many examples regarding AndroidhttpClient on the internet.

Here is my code that was adjusted:

    AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
    HttpGet request = new HttpGet(linkk);   
    HttpResponse response = client.execute(request); //here is where the exception is thrown    
    response.getEntity().writeTo(new FileOutputStream(f));

This is what the logcat shows:

     01-03 01:32:11.950: W/dalvikvm(17991): threadid=1: thread exiting with uncaught exception (group=0x40a2e1f8)
     01-03 01:32:11.986: E/AndroidRuntime(17991): FATAL EXCEPTION: main
     01-03 01:32:11.986: E/AndroidRuntime(17991): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lacra.fbirthdays/com.lacra.fbirthdays.ListV}: android.os.NetworkOnMainThreadException
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.app.ActivityThread.access$600(ActivityThread.java:123)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.os.Handler.dispatchMessage(Handler.java:99)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.os.Looper.loop(Looper.java:137)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at android.app.ActivityThread.main(ActivityThread.java:4424)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at java.lang.reflect.Method.invokeNative(Native Method)
     01-03 01:32:11.986: E/AndroidRuntime(17991):   at java.lang.reflect.Method.invoke(Method.java:511)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at dalvik.system.NativeStart.main(Native Method)
    01-03 01:32:11.986: E/AndroidRuntime(17991): Caused by: android.os.NetworkOnMainThreadException
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at java.net.InetAddress.getAllByName(InetAddress.java:220)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    01-03 01:32:11.986: E/AndroidRuntime(17991):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

解决方案

StrictMode.ThreadPolicy was introduced since API Level 9 and the default thread policy had been changed since API Level 11, which in short, does not allow network operation (include HttpClient and HttpUrlConnection) get executed on UI thread. if you do this, you get NetworkOnMainThreadException.

This restriction can be changed, using:

    if (android.os.Build.VERSION.SDK_INT > 9) {
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
      StrictMode.setThreadPolicy(policy);
    }

Add the above code into your main activity's onCreate() method.

In addition, it is always recommended to move network operation off the UI thread, for example, using AsyncTask.

hope this help.