在Android中实例化HttpClient时出现IllegalArgumentException

时间:2013-08-01 17:27:22

标签: android apache-httpclient-4.x illegalargumentexception

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

以下是堆栈跟踪的摘录:

java.lang.IllegalArgumentException: androidApplicationContext must be not null!
at org.apache.http.impl.client.naf.gba.connector.GbaServiceConnectorSynchronizedSingleton.instance(GbaServiceConnectorSynchronizedSingleton.java:76)
at org.apache.http.impl.client.naf.gba.shared.KeeperManager.init(KeeperManager.java:68)
at org.apache.http.impl.client.naf.auth.NafHttpAuthStrategyDefault.initSharedResources(NafHttpAuthStrategyDefault.java:119)
at org.apache.http.impl.client.naf.auth.NafHttpAuthStrategyDefault.(NafHttpAuthStrategyDefault.java:95)
at org.apache.http.impl.client.AbstractHttpClient.(AbstractHttpClient.java:168)
at org.apache.http.impl.client.DefaultHttpClient.(DefaultHttpClient.java:113)

1 个答案:

答案 0 :(得分:9)

解决方案

  1. 使用 HttpURLConnection 代替 HttpClient 。根据Android开发人员的博客,它是最佳选择:http://android-developers.blogspot.fr/2011/09/androids-http-clients.html
  2. 尽快在应用程序的主线程中创建 HttpClient 的实例,例如在 onCreate 方法中。
  3. 原因

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

    java.lang.IllegalArgumentException:androidApplicationContext必须不为空!

    在我的特定情况下,由于分析库,它被抛入GbaServiceConnectorSynchronizedSingleton.java第76行。

    如何重现

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