当我需要使用活动上下文时如何避免静态上下文引用?
看完这个话题avoiding memory leaks有些疑惑引起了。当我需要使用活动上下文时如何避免静态上下文引用?
如果我需要使用活动上下文(例如:在PopupWindow
类中展开一个视图以显示弹出窗口),我怎样才能保持实际活动的上下文来执行此操作?如果我需要避免静态上下文引用,唯一的方法是在我的类中创建一个属性?所有其他课程我需要实际的活动环境,我需要做到这一点?
最新情况:
我想在不继承的上下文,就像我在我的应用程序类应用程序上下文,有一个叫getApplicationContext()
声明的静态方法使用许多类使用这个实际活动范围内。这种方法遵循Singleton设计模式并且工作正常。
这会让您的应用程序崩溃,因为您的活动在资源用完时将被操作系统杀死,因此上下文也将为空。并且当您想要显示在前台弹出时,它的无意义给予后台活动实例活动..什么是博客说的是避免将activity.this,甚至getApplicationContext()可以做的工作..
从您的评论链接代码的工作,为什么不这样做:
//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;
}
}
感谢您的回答!但是,它不是那么简单。正如我之前所说的,这种创建不是直接发生,我通过这种方式来简化你的理解。实际上,对于这个创建,我将收到一个带有SASConnection类的xml文件,使用SASEnvelope类填充我的类,并且当我在扩展这个SASEnvelope时,我为这个xml文件中的每个节点创建了这些视图。所以,通过这种方式,您需要将上下文传递给SASConn,然后传递给SASEnvelope,最后传递给我创建视图的每个类。我试图避免这种做法,并得到另一种解决方案。 – digulino 2012-04-04 23:29:40
听起来你需要重新考虑你的架构并简化它。 – elevine 2012-04-05 01:10:07
那么,我的问题很简单。当你需要在一个没有继承上下文的类中保存当前的活动上下文时,你总是必须将它传递给一个方法对吗?如果您在该课程的其他方面需要它,您需要为此环境创建一个专用字段?我想我必须这样做,如果我想消除静态上下文引用。 – digulino 2012-04-05 16:34:15
是Activity可能创建其中一个类的实例,并将其作为Context传入?如果你分享一些代码,这将有助于解释你需要什么。 – elevine 2012-04-04 13:59:34
我认为这不是,因为这些类不是直接创建的,而是根据xml对象中的节点创建了许多类。我希望这段代码能够理解我的情况:http://pastebin.com/x3LcgF0f – digulino 2012-04-04 16:03:28
那么,什么是触发HTTP请求和处理XML?它是来自活动的服务还是用户发起的操作? – elevine 2012-04-04 17:10:41