我正在尝试编写一个简单的服务,每隔几秒就会做一些事情。但是当我在主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;
}
答案 0 :(得分:6)
AsyncTask documentation声明:
执行顺序
首次引入时,AsyncTasks在单个上串行执行 背景线程。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
因此,较新版本的android会有你描述的这个问题。您需要使用executeOnExecutor来确保您在不同的线程上运行。
此外,如果您想要在单独的线程中运行服务,我建议:
答案 1 :(得分:0)
如果它在服务中只使用Thread或Callable。 AsyncTask用于UI线程。服务不是UI线程。
以下是API所说的内容: “理想情况下,AsyncTasks应该用于短时间操作(最多只需几秒钟。)如果需要保持线程长时间运行,强烈建议您使用由提供的各种API。 java.util.concurrent pacakge,如Executor,ThreadPoolExecutor和FutureTask“