簡體   English   中英

android什么時候會清除新清除的線程?

[英]When the newly cleared thread would be cleared by android?

我有一種以共享偏好寫入數據的方法,例如,

private static void save(final Context context, final String key, final Object value) {
     new Thread(new Runnable() {
         @Override
         public void run() {
             SharedPreferences sharedPref = context.createDeviceProtectedStorageContext().getSharedPreferences(MY_SHARED_PREF, Context.MODE_PRIVATE);
             SharedPreferences.Editor editor = sharedPref.edit();
             if (value instanceof Integer) {
                 editor.putInt(key, (Integer) value);
             } else if (value instanceof Long) {
                 editor.putLong(key, (Long) value);
             }
             editor.apply();
         }
     }).start();
 }

Android 文檔說,

決定擁有多少線程時的另一個考慮因素是線程不是空閑的:它們占用了 memory。 每個線程至少花費 64k 的 memory。 這會在設備上安裝的許多應用程序中迅速增加,尤其是在調用堆棧顯着增長的情況下。

它鼓勵創建像Handler線程這樣的單個線程並使用它來執行后台工作。

我的想法是保存操作可能需要一些時間,因此計划將它放在后台線程中,但對於以下問題,我沒有明確的答案,這阻止了我這樣做。

  1. 當調用者存在這個方法時,分配給這個線程的資源會被釋放嗎?

  2. 當這個save util 方法調用太多時會發生什么? 線程創建會是開銷嗎?

  3. 就我而言,我不想與 UI 線程進行通信,也不想嘗試與另一個線程進行通信。 我唯一的目的是在單獨的線程中做一個耗時的(不是長時間運行的)任務。 這里哪一個會是更好的線程創建或 Handler 或Async 任務

有人請幫我理解這一點。

  1. 線程完成后資源將被釋放。 在您的情況下,在 editor.apply() 完成其工作之后。 這通常會比 save() 方法返回的時間更晚(或更晚)發生。

  2. 線程創建在這里應該不是一個大問題,但是許多線程的共存才是。 它們不僅會消耗大量 memory,還會競爭訪問您的 SharedPreferences,這可能會導致非常糟糕的性能。

    但是,是的,過於頻繁地創建短期線程的 CPU 開銷也很重要。 這就是為什么任何類型的線程池(例如 Executor)都會更好地為您服務的原因。

  3. AsyncTask 是一個不錯的實用程序,但它也有一些小故障(如果不小心使用,它可能會導致引用泄漏和其他惡作劇)。 它最近已被棄用 此外,在您的情況下,您需要一個工作線程來執行所有操作(如上所述)。 而且您不需要由 Android 管理的 Handler。 SingleThreadExecutor可能是您的最佳解決方案。

暫無
暫無

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

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