DefaultHttpClient 阻塞不同的线程
DefaultHttpClient blocking different threads
我有一个 Android 应用程序,其后台服务可将信息发送到 HTTP 服务器。在前台,我有一个 Activity
可以获取 UI 的信息。两者都使用从 AsyncTask
继承的 doSending
class 来进行实际通信。
在这个doSending
class中,我实例化了一个DefaultHttpClient
到运行的通讯。但是,"foreground" 通信(由用户触发)似乎被 "background" 通信(由计时器触发)阻止。
private class doSending extends AsyncTask<Telegram, Integer, Long> {
[..]
@Override
protected Long doInBackground(Telegram... telegrams) {
[..]
HttpClient c = new DefaultHttpClient();
[..]
c.execute();
}
[..]
}
这样调用:
Telegram t = new Telegram();
new doSending().execute(t);
DefaultHttpClient
在应用程序范围内一次只能有一个连接是真的吗?如果是这样,我该如何进行多连接?
您确定是 HttpClient 而不是 AsyncTask 只能有一个 运行ning 实例吗?如果我没记错的话,AsyncTask 的默认线程池(不幸的是)有 1 个与之关联的线程,这意味着在任何给定时间只有 1 个活动的 AsyncTask 可以 运行。
要修复,您可以试试这个:
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
看看这个 link 作为参考:http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html
特别是这句话:If your android:targetSdkVersion is set to 13 or higher, and you are running on Android 4.x or higher, AsyncTask will use an Executor that executes only one task at a time
.
我有一个 Android 应用程序,其后台服务可将信息发送到 HTTP 服务器。在前台,我有一个 Activity
可以获取 UI 的信息。两者都使用从 AsyncTask
继承的 doSending
class 来进行实际通信。
在这个doSending
class中,我实例化了一个DefaultHttpClient
到运行的通讯。但是,"foreground" 通信(由用户触发)似乎被 "background" 通信(由计时器触发)阻止。
private class doSending extends AsyncTask<Telegram, Integer, Long> {
[..]
@Override
protected Long doInBackground(Telegram... telegrams) {
[..]
HttpClient c = new DefaultHttpClient();
[..]
c.execute();
}
[..]
}
这样调用:
Telegram t = new Telegram();
new doSending().execute(t);
DefaultHttpClient
在应用程序范围内一次只能有一个连接是真的吗?如果是这样,我该如何进行多连接?
您确定是 HttpClient 而不是 AsyncTask 只能有一个 运行ning 实例吗?如果我没记错的话,AsyncTask 的默认线程池(不幸的是)有 1 个与之关联的线程,这意味着在任何给定时间只有 1 个活动的 AsyncTask 可以 运行。
要修复,您可以试试这个:
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
看看这个 link 作为参考:http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html
特别是这句话:If your android:targetSdkVersion is set to 13 or higher, and you are running on Android 4.x or higher, AsyncTask will use an Executor that executes only one task at a time
.