服务在另一个运行时不起作用



我有两个服务侦听两个不同端口上的连接,当只有一个服务正在运行时,它们都工作正常,但是当我运行一个服务而另一个服务正在运行时,第二个服务无法按预期工作

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();
}
}

我在我的主要活动的创建方法中启动此服务

服务器服务

@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();
}
}

在主活动中按下按钮时启动此服务

当我调试我的应用程序时 doInBackground 服务器方法服务没有得到调用 当 httpService 正在运行时

提前致谢

我假设你在 API 级别>= 11 上运行它。引用文档AsyncTask

首次引入时,AsyncTasks 是在单个上串行执行的 后台线程。从DONUT开始,这被改为一个池 允许多个任务并行运行的线程。从HONEYCOMB,任务在单个线程上执行以避免公共 并行执行导致的应用程序错误。

如果你真的想要并行执行,你可以调用executeOnExecutor(java.util.concurrent.Executor, Object[])THREAD_POOL_EXECUTOR.

这意味着您在serverService中的AsyncTask将永远不会执行,因为负责执行 AsyncTasks 的线程已经被您在httpService中的AsyncTask占用。

虽然您可以通过允许并行执行 AsyncTasks 来解决此问题,如上面的引用中所述,但这不是您想要的方式。您对 AsyncTasks 的使用与其预期用途 100% 相矛盾(再次引用 API 文档):

AsyncTask被设计为一个围绕ThreadHandler的帮助类 并且不构成通用线程框架。异步任务 理想情况下,应该用于短操作(几秒钟 大多数。如果需要长时间保持线程运行, 强烈建议您使用java.util.concurrent包,如ExecutorThreadPoolExecutorFutureTask.

最新更新