所以,我的第一个主要应用程序几乎已编码,我正在对我的代码进行优化。该应用程序工作正常,但我不确定我将上下文传递给其他类的方式。我不想以错误的方式去做。我在Stackoverflow中偶然发现了关于上下文的文章和问题,这是将它传递给非活动类的正确方法。我也阅读了文档,但作为一名芬兰人,使复杂的技术更难以理解。
所以,一个简单的问题。我将主要活动的上下文传递给其他(帮助者)类的方式是否正确?如果没有,我可以在哪里阅读更多关于这些情况的更好实践。
例如: MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle sis){
super(sis);
new Helper(MyActivity.this).makeMyAppAwesome();
}
}
Helper.java
public class Helper {
Context context;
Helper(Context ctx){
this.context = ctx;
}
public void makeMyAppAwesome(){
makeBaconAndEggsWithMeltedCheese(context);
}
}
这样好吗?如果有人可以提供一个易于阅读的文章,并提供有关此主题的示例,那就太好了。
答案 0 :(得分:37)
您可以使用ContextWrapper
,as described here.
例如:
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
public void makeMyAppAwesome(){
makeBaconAndEggsWithMeltedCheese(this);
}
}
从活动
中调用非活动类new MyContextWrapper(this);
答案 1 :(得分:1)
在您需要的时刻传递当前上下文通常符合您的最佳利益。将其存储在成员变量中可能会导致内存泄露,并在您的应用中构建更多活动和服务时开始导致问题。
public void iNeedContext(Context context) {...
此外,在任何具有上下文的类中,我建议创建成员变量以实现可读性和可搜索性,而不是直接传递或(ClassName.)this
。例如,在MainActivity.java
:
Context mContext = MainActivity.this;
Activity mActivity = MainActivity.this;
答案 2 :(得分:0)
我已经通过这样的上下文解决了我的问题:
public class Utils extends ContextWrapper {
private final Context context;
public Utils(Context context) {
super(context);
this.context = context;
}
public void mymethod(){}
}
super(context);
和 ContextWrapper
有助于使 getBaseContext()
和 getApplicationContext()
有效并且 this.context = context;
在变量中捕获上下文,我可以在方法中需要的任何地方使用。
也许您可以选择使用带有 this.context = context;
的构造函数并替换所有出现的 getApplicationContext()
和 getBaseContext()
。
好吧,如果只使用类中的少量上下文以避免内存泄漏,则更好的方法是将上下文直接传递给方法。
答案 3 :(得分:-3)
您还可以为MainActivity
方法中初始化的onCreate()
创建静态实例引用
public class MainActivity extends AppCompatActivity {
public static MainActivity mMainActivity;
@Override
private onCreate(Bundle savedInstanceState){
//...
mMainActivity = this;
}
}
并调用上下文:
MainActivity.mMainActivity;
或者如果方法getInstanceOf()
更清晰和/或您更喜欢使用访问者,请编写方法
MainActivity.getInstanceOf();
如果您稍后决定要调用主活动中包含的实例方法,则此策略可能会为您提供一些灵活性:
MainActivity.mMainActivity.myInstanceMethod();
只是一个建议。批评是受欢迎和鼓励的。