簡體   English   中英

如何從非活動類中檢索上下文?

[英]How to retrieve a context from a non-activity class?

我找到了一個答案似乎說我應該創建一個單獨的類並創建一個靜態MyApplication對象並創建一個get方法。 然后任何類都可以調用MyApplication.get()來檢索上下文。

還有其他清潔方式嗎? 這是我的情況:

我有一個A類和一個B類.A類包含一個B類對象(讓我們調用對象b)。 在課程AI調用中,“b.play()”。 但是,我得到一個空指針異常,因為類B需要將一個上下文傳遞給MediaPlayer.create()方法。

到現在為止,我把一個黑客和來自AI的類叫起來......“b.play(this)”並簡單地將上下文傳遞給B.然而,這非常丑陋,看起來像是對OOP的錯誤使用。

有什么想法嗎?

這個問題似乎在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! :)

如果B類需要一個Context來操作,那么我沒有看到任何問題讓A類提供它(通過play方法的參數,構造函數中的參數等)。

我不認為你通過為B類提供它需要做的工作所需的依賴性來做任何糟糕的OOP。

我也在這里回答。

您可以使用ContextWrapper執行此操作, 如此處所述。

例如:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

   public void someMethod() {
      // MediaPlayer.create(this, ...)
   }

}

傳遞this方法是一種可行的方法,特別是如果this是創建需要Context的對象的活動。 有時候,我會把Context放到構造函數中(比如public MyObject(Context context){this.context = context;} ),這樣你就不需要每次都發送它了。 但是,如果您的對象在多個活動中共享,您可能應該使用新活動更新它正在查看的上下文,但我還沒有測試使用舊活動時會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM