首页 > 解决方案 > 在 Android Marshmallow 设备中使用 HTTP Apache 客户端运行为 Android Kitkat 制作的 APK

问题描述

我为使用以下 Apache 类的 Android KitKat (4.4) 构建了一个应用程序:

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

我在 Android 的文档中读到他们删除了与 Apache HTTP 客户端的兼容性,但我想知道这对于为以前版本制作的应用程序意味着什么。那么如果我在 Android Marshmallow (6.0) 设备上运行我的应用程序会发生什么?我可能会面临哪些问题?

作为旁注,我已经将我的应用程序安装在具有 Android 6.0 的设备中,并且我面临有关向我的服务器发出的 HTTP 请求的问题,但由于我不确定可能会出现什么兼容性问题,我只能假设(但不确定) 它可能是相关的。

问题如下:

  1. 当我打开设备并通过 BOOT_COMPLETED 广播启动我的应用程序时,我的应用程序向我的服务器发出的 HTTP 请求是成功的。
  2. 在我认为只能是随机时间之后,所有请求都返回以下错误:
11-29 10:11:50.690 22608 22770 W System.err: org.apache.http.conn.ConnectTimeoutException: Connect to /10.56.12.131:80 timed out
11-29 10:11:50.691 22608 22770 W System.err:    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:126)
11-29 10:11:50.691 22608 22770 W System.err:    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
11-29 10:11:50.691 22608 22770 W System.err:    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
11-29 10:11:50.692 22608 22770 W System.err:    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
11-29 10:11:50.692 22608 22770 W System.err:    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366)
11-29 10:11:50.692 22608 22770 W System.err:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
11-29 10:11:50.692 22608 22770 W System.err:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
11-29 10:11:50.692 22608 22770 W System.err:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
11-29 10:11:50.693 22608 22770 W System.err:    at com.colaboracionvirtual.provisioningmanager.services.SynchronizationService$ServiceCall.doInBackground(SynchronizationService.java:221)
11-29 10:11:50.693 22608 22770 W System.err:    at com.colaboracionvirtual.provisioningmanager.services.SynchronizationService$ServiceCall.doInBackground(SynchronizationService.java:1)
11-29 10:11:50.693 22608 22770 W System.err:    at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-29 10:11:50.693 22608 22770 W System.err:    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-29 10:11:50.693 22608 22770 W System.err:    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-29 10:11:50.693 22608 22770 W System.err:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-29 10:11:50.693 22608 22770 W System.err:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-29 10:11:50.693 22608 22770 W System.err:    at java.lang.Thread.run(Thread.java:818)

注意:10.56.12.131:80 是我的 Web 服务器的 IP 地址和端口

即使在使用 停止我的应用程序am force-stop my.app然后使用 重新启动它之后am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n my.app/.receivers.BootReceiver,对我的服务器的所有 HTTP 请求都会继续抛出该超时错误。

为了调试问题,我使用 netstat 命令进行了 arround,结果如下:

  1. 当 HTTP 请求正常工作时,我从 netstat 获得以下输出:
nobody@rk312x:/ # netstat -tn | grep 10.56.12.131:80
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      1 ::ffff:192.168.89.2:48752 ::ffff:10.56.12.131:80  SYN_SENT
  1. 当 HTTP 请求引发超时错误时,我从 netstat 获得以下输出:
nobody@rk312x:/ # netstat -tn | grep :80
tcp        1      0 192.168.89.2:53676      10.56.12.131:80         CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:37081 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        0      0 ::ffff:192.168.89.2:38081 ::ffff:10.56.12.131:80  ESTABLISHED
tcp        1      0 ::ffff:192.168.89.2:40148 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:35892 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:45924 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:42781 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:37544 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:58794 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:56087 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:40208 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:58789 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:44985 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:50971 ::ffff:10.56.12.131:80  CLOSE_WAIT
tcp        1      0 ::ffff:192.168.89.2:49985 ::ffff:10.56.12.131:80  CLOSE_WAIT  

最奇怪的是,我通过 ADB 向使用的服务器发出请求,busybox wget http://10.56.12.131/api/service/结果没有任何问题。

仅供参考:我的应用程序使用库httpcore-4.3.2.jar和.httpmime-4.3.1.jarcommons-io-2.4.jar

注意:这个问题是关于安装为 Android Kitkat 和 Android 6.0 编译的 APK,而不是为 Android 6.0 重新编译它,然后将其安装在同一个操作系统中。

标签: javaandroidhttpandroid-6.0-marshmallowapache-httpclient-4.x

解决方案


推荐阅读