簡體   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