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 documentation 说,

Another consideration in deciding on how many threads to have is that threads aren’t free: they take up memory. Each thread costs a minimum of 64k of memory. This adds up quickly across the many apps installed on a device, especially in situations where the call stacks grow significantly.

它鼓励创建一个像 Handler 线程一样的线程,并用它来做后台工作。

我的想法是保存操作可能需要一些时间所以计划在后台线程中进行,但是对于以下问题我没有明确的答案这阻止了我这样做。

  1. 当调用者存在该方法时,分配给该线程的资源是否会被释放?

  2. 如果调用此 save util 方法的次数过多,会发生什么情况?线程创建会是一种开销吗?

  3. 在我的例子中,我不想与 UI 线程通信,也不想与另一个线程通信。我的唯一目的是在单独的线程中执行一个时间(不是很长 运行 一个)消耗任务。这里哪个更好线程创建或处理程序或Async task?

谁能帮我理解一下。

  1. 线程结束后资源将被释放。在你的例子中,在 editor.apply() 完成它的工作之后。这通常会比 save() 方法更晚(或更晚)发生 returns.

  2. 线程创建在这里应该不是什么大问题,但是很多线程的共存是。它们不仅会消耗大量内存,还会竞争对您的 SharedPreferences 的访问权限,这可能会导致非常糟糕的性能。

    但是,是的,CPU 过于频繁地创建短期线程的开销也很重要。这就是为什么任何类型的线程池(例如 Executor)都会为您提供更好的服务。

  3. AsyncTask 是一个不错的实用程序,但它也有缺陷(如果不小心使用,它可能会导致引用泄漏和其他恶作剧)。最近 deprecated. Also, in your case you want a single worker thread to perform all manipulations (as I mentioned above). And you don't need a Handler managed by Android. A 可能是最适合您的解决方案。