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

时间:2017-03-25 05:04:02

标签: java android

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

的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正在运行

提前致谢

1 个答案:

答案 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旨在成为围绕ThreadHandler的助手类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrentExecutorThreadPoolExecutorFutureTask包   {{1}}。