2011-10-24 109 views
47

所以,我的第一個主要應用程序幾乎編碼,我正在對我的代碼進行優化。該應用程序工作正常,但我不確定我的方式將上下文傳遞給其他類。我不想這樣做。我偶然發現了有關上下文的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); 
    } 
} 

這樣行嗎?如果有人能夠提供一個容易閱讀的文章並帶有關於這個主題的例子,這將是很好的。

+3

拇指的基本規則是不抱到了'Context'長於'Context'存在。 –

+0

這是我不確定我理解的一種說法。很明顯,我不在另一個Activity中使用相同的上下文,但是這可能不是您所說的內容? –

+3

對於這個例子來說,關鍵在於理解Activity的生命週期。這將防止內存泄漏並使用Activity的舊實例(在您的示例中不會發生這種情況)。在你的幫手中,我將包括一種方法來在onStop中設置activity null並在onStart中再次設置該值。 –

回答

33

你可以做,使用ContextWrapperas described here.

例如:

public class MyContextWrapper extends ContextWrapper { 

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

    public void makeMyAppAwesome(){ 
     makeBaconAndEggsWithMeltedCheese(this); 
    } 
} 

,並調用非活性類這樣從活動

new MyContextWrapper(this); 
+1

歡迎來到SO,真的提供了比現有更好的答案,並在第一篇文章的熱門問題上被接受!我已經編輯過你的答案,只是爲了正確地設置代碼格式 - 請在下次回答時查看幫助鏈接獲取更多信息。 :) – OJFord

+2

如果我的課程已經擴展了其他一些課程,就不能使用它。 –

+0

這與保留上下文一樣糟糕。請注意,ContextWrapper將保持對上下文的引用。如果你使用這個,那麼確保你創建的ContextWrapper被正確解除引用。 –

-3

你也可以創建一個靜態實例引用您的MainActivityonCreate()方法中初始化

public class MainActivity extends AppCompatActivity { 

    public static MainActivity mMainActivity; 

    @Override 
    private onCreate(Bundle savedInstanceState){ 

    //... 

    mMainActivity = this; 

    } 
} 

,並調用這樣的背景下:

MainActivity.mMainActivity; 

或寫一個方法getInstanceOf()如果它更清晰和/或你喜歡使用訪問

MainActivity.getInstanceOf(); 

這一策略可能會爲您提供如果稍後決定要調用主要活動中包含的實例方法,則可以採用一些靈活性:

MainActivity.mMainActivity.myInstanceMethod(); 

只是一個建議。批評是受歡迎和鼓勵的。

+0

public static MainActivity mMainActivity;這將創建一個Activity的全局靜態實例,不會被垃圾收集,因此會泄漏內存。 –

1

通常在您需要的時候傳遞當前上下文通常符合您的最佳利益。將它存儲在一個成員變量中可能會導致內存泄露,並且在您的應用程序中構建更多活動和服務時開始引發問題。

public void iNeedContext(Context context) {... 

此外,在具有上下文的任何類,我建議製備一個成員變量是爲了可讀性和可搜索的,而不是直接傳遞或(ClassName.)this。例如,在MainActivity.java

Context mContext = MainActivity.this; 
Activity mActivity = MainActivity.this; 
相關問題