发布 MainThread Runnables 内存泄漏安全 Android

Posted

技术标签:

【中文标题】发布 MainThread Runnables 内存泄漏安全 Android【英文标题】:Posting MainThread Runnables Memory Leak Safe Android 【发布时间】:2018-12-30 04:05:21 【问题描述】:

我有一个关于内存泄漏的问题。我有以下匿名课程。您可能知道匿名类持有来自外部对象的引用(这里是 Activity)。此代码是否会导致内存泄漏?在定向的情况下,这将保留旧活动。对吧?

谢谢

public class MainActivity extends AppCompatActivity


recyclerview.post(new Runnable() 
@Override
public void run() 
    // Notify adapter with appropriate notify methods
    adapter.notifyItemRangeInserted(curSize, allContacts.size() - 1);

);


【问题讨论】:

【参考方案1】:

这段代码是否会导致内存泄漏?

不是真的。 Runnable 应该在一毫秒左右执行 - 否则,你有更大的问题。

如果Runnable 存在很长一段时间,那么你可能有内存泄漏。

【讨论】:

我怎么知道这个runnable是否存在很长一段时间?如果由于某种原因主线程无法在旋转发生之前执行此可运行对象,则会出现内存泄漏。但即便如此,我该如何控制呢?我认为没有解决方法 @Nick:“我怎么知道这个 runnable 是否存在很长一段时间?” -- 调用post() 不会导致长期存在的Runnable,除非您的应用程序中有严重的错误导致主应用程序线程长时间忙碌。 “如果由于某种原因主线程无法在旋转发生之前执行此可运行对象,则会出现内存泄漏” - 这将是由于您的代码中的错误占用了主应用程序线程。 “我怎么能控制这个?” -- 修复代码中占用主应用程序线程的错误。 如果在 runnable 执行之前有什么东西杀死了这个活动,就会有内存泄漏

以上是关于发布 MainThread Runnables 内存泄漏安全 Android的主要内容,如果未能解决你的问题,请参考以下文章

执行新的runnables时丢失ApplicationContext

驱动器只能从 MainThread 调用

AsyncTask 与 MainThread

如何从异步上下文切换 MainThread 的 CurrentCulture?

如何从不同的线程访问 MainThread 元素? [复制]

RxJava 如何在旧版本的主线程上观察?我无权访问 AndroidSchedulers.mainThread()