8

在 google play 控制台中,我可以看到来自抱怨的用户的崩溃报告,因为我的应用程序在启动后就崩溃了。原因似乎是实例化 HttpClient 时抛出的异常。我究竟做错了什么?

这是堆栈跟踪的摘录:

java.lang.IllegalArgumentException: androidApplicationContext 不能为空!
在 org.apache.http.impl.client.naf.gba.connector.GbaServiceConnectorSynchronizedSingleton.instance(GbaServiceConnectorSynchronizedSingleton.java:76)
在 org.apache.http.impl.client.naf.gba.shared.KeeperManager.init(KeeperManager.java:68)
在 org.apache.http.impl.client.naf.auth.NafHttpAuthStrategyDefault.initSharedResources(NafHttpAuthStrategyDefault.java:119)
在 org.apache.http.impl.client.naf.auth.NafHttpAuthStrategyDefault.(NafHttpAuthStrategyDefault.java:95)
在 org.apache.http.impl.client.AbstractHttpClient.(AbstractHttpClient.java:168)
在 org.apache.http.impl.client.DefaultHttpClient.(DefaultHttpClient.java:113)
4

1 回答 1

9

解决方案

  1. 使用HttpURLConnection而不是HttpClient。根据 Android 开发者的博客,最好的选择是:http ://android-developers.blogspot.fr/2011/09/androids-http-clients.html 。
  2. 尽快在应用程序的主线程中创建一个HttpClient实例,例如在其onCreate方法中。

原因

一些 android 设备,如 T-Mobile MyTouch Q,使用 Apache HttpClient 库的自定义实现。在此类设备上,不在主线程中创建应用程序的第一个 HttpClient 将导致抛出异常:

java.lang.IllegalArgumentException: androidApplicationContext 不能为空!

在我的具体情况下,由于一个分析库,它被扔进了 GbaServiceConnectorSynchronizedSingleton.java 的第 76 行。

如何重现

这是一个允许重现问题的测试用例的链接: https ://gist.github.com/Bastoche/6133227

于 2013-08-02T08:07:32.803 回答