gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:26 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的服务,它每隔几秒就会执行一次操作。但是,当我在尝试在主 Activity 中运行其他 AsyncTasks 的同时运行该服务时,我注意到其他 AsyncTasks 卡在了 onPreExecute。当我禁用该服务时,一切都按预期进行。 Service 的 AsynTask 阻塞其他 AsyncTask 是否有原因?

服务

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 documentation状态:

Order of execution

When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

因此,较新版本的 android 将出现您描述的这个问题。您需要使用 executeOnExecutor 来确保您在单独的线程上运行。

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

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

关于java - 为什么我的服务的 AsyncTask 会阻止来自主 Activity 的 AsyncTasks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com