我有两个服务侦听两个不同端口上的连接,当它们中只有一个正在运行但是当我运行一个服务而另一个服务正在运行时,它们都工作正常,第二个服务无法按预期工作
的HTTPService
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: ");
try {
mAsy = new asy();
mAsy.execute();
}
catch (Exception e){
e.printStackTrace();
}
return START_NOT_STICKY;
}
class asy extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
try {
server = new ServerSocket(25452);
while (true) {
Socket socket = server.accept();
new Thread(new httpHandler(socket)).start();
}
} catch (IOException e) {
Log.e(MyApplication.TAG, e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Object o) {
mAsy = new asy();
mAsy.execute();
}
}
我在主要活动的onCreate方法中启动此服务
Server服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try {
mAsy = new asy();
mAsy.execute();
}
catch (Exception e){
e.printStackTrace();
}
return START_NOT_STICKY;
}
class asy extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
try {
server = new ServerSocket(25432);
while (true) {
Socket socket = server.accept();
new Thread(new connectionHandler(socket)).start();
}
} catch (IOException e) {
Log.e(MyApplication.TAG, e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Object o) {
mAsy = new asy();
mAsy.execute();
}
}
在主要活动中按下按钮时启动此服务
当我调试我的应用程序时,serverService的doInBackground方法没有得到调用 而httpService正在运行
提前致谢
答案 0 :(得分:0)
我假设您在API级别运行此操作> = 11.为AsyncTask
引用the documentation:
首次引入时,AsyncTasks在单个上串行执行 背景线程。从
DONUT
开始,这被更改为一个池 允许多个任务并行运行的线程。从...开始HONEYCOMB
,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。如果您真的想要并行执行,可以调用
executeOnExecutor(java.util.concurrent.Executor, Object[])
THREAD_POOL_EXECUTOR
。
这意味着AsyncTask
中的serverService
永远无法执行,因为负责执行AsyncTasks的线程已被AsyncTask
中的httpService
占用。
虽然可以通过允许并行执行AsyncTasks来解决这个问题,如上面引用中所述,但这不是你想要的方式。您对AsyncTasks的使用与其预期用途相矛盾(再次引用the API documentation):
AsyncTask
旨在成为围绕Thread
和Handler
的助手类 并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短期操作(几秒钟的时间) 大多数。)如果你需要保持线程长时间运行, 强烈建议您使用提供的各种APIjava.util.concurrent
,Executor
和ThreadPoolExecutor
等FutureTask
包 {{1}}。