如何从非活动类中检索上下文?

13 java android android-context

我找到了一个答案似乎说我应该创建一个单独的类并创建一个静态MyApplication对象并创建一个get方法.然后任何类都可以调用MyApplication.get()来检索上下文.

还有其他清洁方式吗?这是我的情况:

我有一个A类和一个B类.A类包含一个B类对象(让我们调用对象b).在课程AI调用中,"b.play()".但是,我得到一个空指针异常,因为类B需要将一个上下文传递给MediaPlayer.create()方法.

到现在为止,我把一个黑客和来自AI的类叫起来......"b.play(this)"并简单地将上下文传递给B.然而,这非常丑陋,看起来像是对OOP的糟糕使用.

有什么想法吗?

Ent*_*lpi 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; }
}
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案要求您在清单中指定子类的名称.

<application
    android:name=".MyApplication"
</application>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在非活动类中的应用程序中的任何位置使用它.

MyApplication.getContext();  // Do something with the context! :)
Run Code Online (Sandbox Code Playgroud)

  • 并且由于其内存泄漏潜力,应该避免静态上下文. (2认同)

Bri*_*ger 9

如果B类需要一个Context来操作,那么我没有看到任何问题让A类提供它(通过play方法的参数,构造函数中的参数等).

我不认为你通过为B类提供它需要做的工作所需的依赖性来做任何糟糕的OOP.

  • 这实际上是非常好的 OO 并且使测试更容易。依赖注入是一种常见的设计模式。 (2认同)