java - 在 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 请求的问题,但由于我不确定可能会出现什么兼容性问题,我只能假设(但不确定) 它可能是相关的。
问题如下:
- 当我打开设备并通过 BOOT_COMPLETED 广播启动我的应用程序时,我的应用程序向我的服务器发出的 HTTP 请求是成功的。
- 在我认为只能是随机时间之后,所有请求都返回以下错误:
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,结果如下:
- 当 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
- 当 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.jar
commons-io-2.4.jar
注意:这个问题是关于安装为 Android Kitkat 和 Android 6.0 编译的 APK,而不是为 Android 6.0 重新编译它,然后将其安装在同一个操作系统中。
解决方案
推荐阅读
- python - 为什么显示列表索引超出范围错误?
- svelte - Svelte 绑定:offsetWidth 与上下文
- codeigniter - codeigniter 中的简单选择选项 set_value
- node.js - 如果我在反应本机 npm ERR 中安装任何包,则会出现错误!代码ENOENT
- typescript - 如何扩展打字稿内置类型中的类型
- c - 如何修复这个用 Xcode 编写的代码?在 main 函数中,Xcode 显示错误:Function definition is not allowed here
- android - 在 SigningConfig_Decorated 上找不到参数 [C:/Users/tienn/key.jks] 的方法 storeFile()
- c# - Xamrin 表单在访问之前对页面进行收费
- matlab - 绘制给定在 MATLAB 上实现的某个随机变量的 PMF
- firebase - 在某些 Internet 连接上无法访问 firebase 数据库