繁体   English   中英

为什么我的服务的AsyncTask阻止来自主Activity的AsyncTasks?

[英]Why is my Service's AsyncTask blocking AsyncTasks from the main Activity?

我正在尝试编写一个简单的服务,每隔几秒就会做一些事情。 但是当我在主Activity中尝试运行其他AsyncTasks时运行服务时,我注意到其他AsyncTasks卡在onPreExecute上。 当我禁用该服务时,一切都按预期工作。 服务的AsynTask阻塞其他AsyncTasks是否有原因?

服务

public class SVC_SyncData extends Service {

    private final String TAG = "SVC_SyncData";

    private AT_SyncData m_SyncPoll = null;

    public static boolean isRunning = false;

    public SVC_SyncData() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");
        m_SyncPoll = new AT_SyncData(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        m_SyncPoll.execute();
        isRunning = true;
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
        m_SyncPoll.cancel(false);
        isRunning = false;
    }
}

AT_SyncData的doInBackground

@Override
protected Void doInBackground(Void... params) {
    Log.i(TAG, "doInBackground");

    try {
        while (!isCancelled()) {
            Log.i(TAG, "syncData");

            // Sleep until next cycle
            Thread.sleep(5000);
        }
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

AsyncTask 文档说明:

执行顺序

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

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

因此,较新版本的android会有你描述的这个问题。 您需要使用executeOnExecutor来确保您在不同的线程上运行。

此外,如果您想要在单独的线程中运行服务,我建议:

  1. 使用IntentService
  2. 有时您会希望更多地控制服务的生命周期,而不是IntentService为您提供的服务,在这种情况下,您只需在服务中创建一个线程并运行后台代码即可。 实际上,更具体地说,创建一个包含Looper的HandlerThread ,这样您就可以使用标准的android方法在主线程和后台线程之间进行通信(消息)。 就个人而言,我通常会为我的服务选择此选项。

如果它在服务中只使用Thread或Callable。 AsyncTask用于UI线程。 服务不是UI线程。

以下是API所说的内容:“理想情况下,AsyncTasks应该用于短操作(最多几秒钟)。 如果需要保持线程长时间运行,强烈建议您使用java提供的各种API .util.concurrent pacakge,例如Executor,ThreadPoolExecutor和FutureTask“

的AsyncTask

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM