当我需要使用活动上下文时如何避免静态上下文引用?

问题描述:

看完这个话题avoiding memory leaks有些疑惑引起了。当我需要使用活动上下文时如何避免静态上下文引用?

如果我需要使用活动上下文(例如:在PopupWindow类中展开一个视图以显示弹出窗口),我怎样才能保持实际活动的上下文来执行此操作?如果我需要避免静态上下文引用,唯一的方法是在我的类中创建一个属性?所有其他课程我需要实际的活动环境,我需要做到这一点?

最新情况:

我想在不继承的上下文,就像我在我的应用程序类应用程序上下文,有一个叫getApplicationContext()声明的静态方法使用许多类使用这个实际活动范围内。这种方法遵循Singleton设计模式并且工作正常。

+0

是Activity可能创建其中一个类的实例,并将其作为Context传入?如果你分享一些代码,这将有助于解释你需要什么。 – elevine 2012-04-04 13:59:34

+0

我认为这不是,因为这些类不是直接创建的,而是根据xml对象中的节点创建了许多类。我希望这段代码能够理解我的情况:http://pastebin.com/x3LcgF0f – digulino 2012-04-04 16:03:28

+0

那么,什么是触发HTTP请求和处理XML?它是来自活动的服务还是用户发起的操作? – elevine 2012-04-04 17:10:41

这会让您的应用程序崩溃,因为您的活动在资源用完时将被操作系统杀死,因此上下文也将为空。并且当您想要显示在前台弹出时,它的无意义给予后台活动实例活动..什么是博客说的是避免将activity.this,甚至getApplicationContext()可以做的工作..

+0

那么,我需要做什么?我读过它,并提出一个静态上下文引用不是一个好方法。其实我试图将活动上下文列表保存在静态类的静态字段中。在另一个我称为CustomPopupWindow的类中,我在实际的Activity中给模板充气,这个实际的Activity是我在静态列表中的最后一个元素。 – digulino 2012-04-04 12:26:37

+0

@digulino ..只是使用activity.this ..因为你的popUp只活到你的活动完成..所以活动参考被释放..所以没有内存泄漏... – ngesh 2012-04-05 03:39:07

从您的评论链接代码的工作,为什么不这样做:

//my main activity 
public class ExampleStaticReferenceActivity extends Activity { 
     //... 

    public void methodCalledWhenUserPressesButton(){ 
     LinearLayout masterLayout = (LinearLayout) findViewById(R.id.masterLayout); 
     //now passing a reference to the current activity - elevine 
     masterLayout.addView(ButtonCreator.createButton(this)); 
    } 
} 

//this class is in another package 
public class ButtonCreator { 
     //added a Context parameter - elevine 
     public static Button createButton(Context context) { 
       Button button; 

       button = new Button(context); 
       //... some configurations for button 
       return button; 
     }  

} 
+0

感谢您的回答!但是,它不是那么简单。正如我之前所说的,这种创建不是直接发生,我通过这种方式来简化你的理解。实际上,对于这个创建,我将收到一个带有SASConnection类的xml文件,使用SASEnvelope类填充我的类,并且当我在扩展这个SASEnvelope时,我为这个xml文件中的每个节点创建了这些视图。所以,通过这种方式,您需要将上下文传递给SASConn,然后传递给SASEnvelope,最后传递给我创建视图的每个类。我试图避免这种做法,并得到另一种解决方案。 – digulino 2012-04-04 23:29:40

+0

听起来你需要重新考虑你的架构并简化它。 – elevine 2012-04-05 01:10:07

+0

那么,我的问题很简单。当你需要在一个没有继承上下文的类中保存当前的活动上下文时,你总是必须将它传递给一个方法对吗?如果您在该课程的其他方面需要它,您需要为此环境创建一个专用字段?我想我必须这样做,如果我想消除静态上下文引用。 – digulino 2012-04-05 16:34:15