我发现one answer似乎说我应该创建一个单独的类并创建一个静态MyApplication对象并创建一个get方法。然后任何类都可以调用MyApplication.get()来检索上下文。
还有其他清洁方式吗?这是我的情况:
我有一个A类和一个B类.A类包含一个B类的对象(让我们调用对象b)。在A类中,我称之为“b.play()”。但是,我得到一个空指针异常,因为类B需要将一个上下文传递给MediaPlayer.create()方法。
到现在为止,我把一个黑客和A类混在一起,我打电话给了......“b.play(this)”并简单地将上下文传递给了B.然而,这很丑陋,看起来像是对OOP的错误使用。
有什么想法?
答案 0 :(得分:11)
这个问题似乎在Android开发中出现了很多。获取对特定Context的引用的一种解决方案是继承Application并获取对所需Context的引用。
public class MyApplication extends Application {
private Context context;
@Override
public onCreate() {
super.onCreate();
this.context = getApplicationContext() // Grab the Context you want.
}
public static Context getApplicationContext() { return this.context; }
}
但是,此解决方案要求您在清单中指定子类的名称。
<application
android:name=".MyApplication"
</application>
然后,您可以在非活动类中使用此应用程序中的任何位置。
MyApplication.getContext(); // Do something with the context! :)
答案 1 :(得分:8)
如果B类需要一个Context来操作,那么我没有看到A类提供它的任何问题(通过play方法的参数,构造函数中的参数等)。
我认为你没有做任何可怜的OOP,因为它为B类提供了做它的工作所需的依赖。
答案 2 :(得分:1)
传递this
是一种可行的方法,特别是如果this
是创建需要Context的对象的活动。有时,我会将Context放入构造函数(如public MyObject(Context context){this.context = context;}
),这样您就不需要每次都发送它。但是,如果您的对象在多个活动中共享,您可能应该使用新活动更新它正在查看的上下文,但我还没有测试使用旧活动时会发生什么。
答案 3 :(得分:1)
我也回答了here。
您可以使用ContextWrapper
,as described here.
例如:
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
public void someMethod() {
// MediaPlayer.create(this, ...)
}
}