代码之家  ›  专栏  ›  技术社区  ›  1234567

在helper类中使用上下文会导致android内存泄漏吗

  •  0
  • 1234567  · 技术社区  · 9 年前

    在helper类中使用上下文会导致android内存泄漏吗

    public class HelperClass {
            private Context context;
    
            public HelperClass(Context context) {
                this.context = context;
            }
           public void Addfiles(Context context, String Filename) {
                try {
                    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    File f = new File(Filename);
                    Uri contentUri = Uri.fromFile(f);
                    mediaScanIntent.setData(contentUri);
                    context.sendBroadcast(mediaScanIntent);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } 
        }
    

    在我的主要活动中,我想这样称呼它

    public class MyActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            HelperClass h = new HelperClass(this);
            h.Addfiles(this,Filename);
        }
    }
    

    1 回复  |  直到 9 年前
        1
  •  2
  •   cjurjiu    9 年前

    TL;博士 -严格来说,在上述情况下,不会,因为MyActivity在“onCreate”中不会被销毁

    通常,当垃圾收集器运行时,由于某些对象仍引用它而无法对其进行垃圾收集时,就会发生内存泄漏。 在您的情况下,活动刚刚创建,您主要关心的是是否会发生泄漏,因为 HelperClass 包含对它的引用。

    首先,在正常情况下(AOS可能会杀死你的应用除外) MainActivity onDestroy 方法。这是因为在那之前(可能在那之后的一段时间内-并不真正相关),它将被Android框架本身引用。

    onCreate . 之后 将完成, 助手类 可能会在任何时候被垃圾收集,因为它不会有任何对象引用它(请参见 here ). 因此 之前被GC 销毁 --&燃气轮机;无泄漏。

    事件if 助手类 直到 销毁 主要活动 ,您仍然不会有泄漏,因为垃圾收集器足够智能,能够清理循环引用。

    要发生泄漏,需要发生的是一个比你的寿命长的物体 Activity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        final HelperClass h = new HelperClass(this);
    
        //does some work on a background thread, gets notified at some 
        //point in the future, through the callback, when the work 
        //has completed     
        longLivedComponent.doSomeBackgroundWork(new OnWorkFinishedListener(){
    
            @Override
            public void onWorkFinished(){
                h.Addfiles(this, filename);
            }
    
        });
    }
    

    现在,我们还假设以下事件序列:

    1. 主要活动 #1已创建,其 被称为
    2. doSomeBackgroundWork 主要活动 #1) 必须做一些工作。
    3. 主要活动 主要活动 #1被破坏(即。 将被调用),以及一个新的 #将创建2个
    4. 步骤1,2将针对 主要活动 #2。 将再次从 主要活动
    5. 主要活动 #步骤1 #2 饰面。

    被占用的内存 主要活动 主要活动

    然而,在这里描述的情况下 OnWorkFinishedListener 需要由 longLivedComponent 主要活动 #1(对其父类的隐式匿名内部类引用)和 实例,其中还包含一个 #1.

    ,它假设 主要活动 内存中出现漏洞。

    为了防止这种情况,您可以:

    • 在将由长寿命对象使用的类中,使用应用程序上下文而不是活动上下文。此外,在你的情况下,你不需要任何特定于活动本身的东西
    • 确保任何长寿命对象(如本例中的longLivedComponent)或活动之间共享的对象不会存储对 活动 或其 Context onDestroy() 活动