- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的代码有问题,希望得到帮助。我首先使用的是这段代码:
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)
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从 API Level 9 开始引入,并且从 API Level 11 开始更改了默认线程策略,简而言之,不允许在 UI 线程上执行网络操作(包括 HttpClient 和 HttpUrlConnection)。如果你这样做,你会得到 NetworkOnMainThreadException。
这个限制可以改变,使用:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
将上述代码添加到您的主要 Activity 的 onCreate() 方法中。
此外,始终建议将网络操作移出 UI 线程,例如,使用 AsyncTask。
希望对您有所帮助。
关于android - DefaultHttpClient 到 AndroidHttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706464/
一位客户报告了一个奇怪的错误。在 AsyncTask 中执行正常的 AndroidHttpClient.execute() 时,应用程序崩溃,他得到以下堆栈跟踪 java.lang.RuntimeEx
我使用 AndroidHttpClient 从我的代码中收到 IOException。代码有问题吗?无论我使用端口 80 还是 端口 443,以及使用 Http 架构 http 或 https,都会引
我对 Android 开发很陌生(今天才开始),对 Java 开发也很陌生,尽管我已经使用 C# 编程好几年了。 我正在尝试使用 AndroidHttpClient 发出 HTTP 请求,但我的代码甚
我正在使用 Lynda 的 2014 年教程学习 android restful web 服务。代码使用这个 httpManager 类: import android.net.http.And
我正在使用 Android 3.0 和 3.1。我在我的应用程序中使用 AndroidHttpClient 类,我使用 execute(HttpUriRequest) 执行。 我想在发送数据时更新 U
public InputStream getInputStream() { AndroidHttpClient client = AndroidHttpClient.newInstance(U
我已按照 kuester2000's answer 的说明进行操作,但我的超时设置似乎不起作用。 try { int timeout = 3000; URL myURL = //som
我的代码有问题,希望得到帮助。我首先使用的是这段代码: new DefaultHttpClient().execute(new HttpGet(linkk)).getEntity().
这两者之间有很大区别吗?最好使用哪一个? 最佳答案 基于Android源码: https://github.com/CyanogenMod/android_frameworks_base/blob/g
我写了下面的代码,它工作正常: private static final String URL = "http://test.net/api/mobile/logininfo"; private An
我对此比较陌生,我一直在使用 AndroidHttpClient 来帮助通过 Parse 将图像下载到我的应用程序。现在使用 Sdk 23,我必须重写一些类。我的问题很简单。 我们以下面这段没有做任何
我正在尝试使用我的 Android 应用程序登录 https 网站。如果登录成功,网站返回响应代码 302,如果登录不成功,则返回 200。我研究了如何使用 AndroidHttpClient 并查看
我在我的应用程序中使用 AndroidHttpClient。现在我需要对请求使用基本授权。 http://developer.android.com/reference/android/net/htt
关于 AndroidHttpClient 的信息非常少,特别是我找不到任何好的例子。从我读到的内容来看——我可以使用这个客户端,它是为 SSL 预先配置的。我的目标是 2.2+,所以它很适合我。 关于
我建立了一个非常简单的项目来测试 Robolectric + Data Binding + Retrolambda 的集成。当我运行测试服时,我收到以下消息: Error:(30, 30) Gradl
我并没有真正实例化 AndroidHttpClient在我的代码中的任何位置,但我确实启动了一个识别器 Intent ,它在我的应用程序运行时的某个时刻产生了这个异常: Leak found java
我有一个 AsyncTask 设置来创建一个 AndroidHttpClient 并使用 HttpPost 调用 Execute和我提供的 BasicHttpContext 对象。我像这样设置了 Ht
API 级别 9( Gingerbread )哪个更好,为什么?使用 Android HttpClient 而不是 HttpUrlConnection 有什么好处吗? 我们将不胜感激任何帮助或指导。
当我混淆构建和运行时,我当然得到了这个,但我不知道如何修复它。 我尝试添加所有这些我的 proguard 配置文件,但没有帮助: -keep class android.net.http.** { *
目前我正在使用 DefaultHttpClient 和 ThreadSafeClientConnManager。这工作正常,但我想用 AndroidHttpClient 替换它。不幸的是,我无法添加目
我是一名优秀的程序员,十分优秀!