为了账号安全,请及时绑定邮箱和手机立即绑定

从DefaultHttpClient到AndroidHttpClient

从DefaultHttpClient到AndroidHttpClient

隔江千里 2019-12-13 16:10:33
我的代码有问题,希望得到一些帮助。我首先使用此代码:        new DefaultHttpClient().execute(new HttpGet(linkk)).getEntity().writeTo(           new FileOutputStream(f));而且它在android 2.3上工作正常,但在4.0上却没有。经过一些研究,我听说使用AndroidHttpClient更好,并且这种方式可以在4.0和3.1上运行。问题是我不知道我是否正确修改了代码,并且互联网上没有太多有关AndroidhttpClient的示例。这是我的代码已调整:    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));这是logcat显示的内容: 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)
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

使用AsyncTask,以使网络请求不会阻止UI线程。该NetworkOnMainThreadException因为API版本11,这就是为什么它是只显示了3.0和最多的原因进行了介绍。


private class NetworkTask extends AsyncTask<String, Void, HttpResponse> {

    @Override

    protected HttpResponse doInBackground(String... params) {

        String link = params[0];

        HttpGet request = new HttpGet(link);

        AndroidHttpClient client = AndroidHttpClient.newInstance("Android");

        try {

            return client.execute(request);

        } catch (IOException e) {

            e.printStackTrace();

            return null;

        } finally {

        client.close();

    }

    }


    @Override

    protected void onPostExecute(HttpResponse result) {

        //Do something with result

        if (result != null)

            result.getEntity().writeTo(new FileOutputStream(f));

    }

}

要简单地调用此线程,请执行此操作。


new NetworkTask().execute(linkk);

看看这篇写在Android开发人员网站上的文章。它更详细地说明了如何编写应用程序以处理线程。



查看完整回答
反对 回复 2019-12-14
  • 3 回答
  • 0 关注
  • 344 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信