簡體   English   中英

Android AsyncTask.THREAD_POOL_EXECUTOR與使用Runnables的自定義ThreadPool

[英]Android AsyncTask.THREAD_POOL_EXECUTOR vs custom ThreadPool with Runnables

我有一些我需要在Android上同時處理的任務,我想使用某種線程池來執行此操作。 我在文檔中找不到在使用AsyncTask.THREAD_POOL_EXECUTOR執行AsyncTask時“幕后”實際發生的情況。

我的問題是:與AsyncTask.THREAD_POOL_EXECUTOR一起使用AsyncTasks而不是使用Runnables實現自定義ThreadPool,我會失去什么? (讓我們談談后蜂窩)。

我意識到這個問題相當普遍,但我對並發編程相當新(除了AsyncTask本身)。 我不是在尋找並發編程的教程! 我只是想了解Android特定的AsyncTask.THREAD_POOL_EXECUTOR是如何不同的。 我認為解釋將有助於將來的其他人,因為他們權衡選擇使用AsyncTask vs Thread / Runnable的利弊。 提前致謝!

AsyncTasks為您提供在執行工作任務之前和之后在UI線程上執行操作的可能性。 因此,如果您不需要與UI通信,那么請使用您自己的執行程序 - 您始終可以使用處理程序實現此功能。 自api 11以來,AsyncTasks正在連續執行,因為並行執行被認為難以正確實現。

如果您需要更多的靈活性,那么執行器是一種可行的方法,它們將允許您自由指定並行執行的任務數,排隊等數量。

如果您對細節感興趣,可以隨時查看來源:

http://androidxref.com/4.4.3_r1.1/xref/development/samples/training/bitmapfun/BitmapFun/src/main/java/com/example/android/bitmapfun/util/AsyncTask.java

非UI工作可能包括AsyncTasks,HandlerThreads,IntentServices等。

它建議AsyncTasks用於與UI相關的工作(影響UI的工作)的原因是AsyncTask具有幫助程序回調,允許您將控件傳輸到UI線程。

但是,沒有建議更長時間運行的操作,因為默認情況下,它使用全局執行程序,這可能導致應用程序全局等待線程在執行長時間運行操作時停止。 因此,您可以切換到自定義執行程序並擺脫全局影響。

在一天結束時,HandlerThreads再次成為線程,它使Looper保持線程活着。 執行仍然是連續執行的,那么使用它們的真正原因是什么? 我相信這是執行像Executors這樣的Runnables的能力,但更多的是輕量級的。

IntentServices再次 - 串行執行任務的方式,但你有更多的權力和隔離,因為它們完全不同的組件具有獨立的生命周期。 它們會自動銷毀,因此您不必擔心會破壞它們以降低應用程序進程優先級(關閉主題但會導致一些內存性能問題,垃圾等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM