簡體   English   中英

從其他類引用 MainActivity 中的靜態上下文是否不好?

[英]Is refering to static Context in MainActivity from other classes bad?

我已經養成了在編程中走捷徑的習慣,我想知道后果是什么:

在 MainActivity() 中聲明:

 public static Context xt;

在 MainActivity 的 MainActivity 構造函數中

 xt = this;

在我的渲染器構造函數中:

 readTextFile(MainActivity.xt, R.raw.vertexcode);

和函數 readTextFile 使用上下文打開資源

public static String readTextFileFromRawResource(final Context context,
         final int resourceId)
 {
     final InputStream inputStream = context.getResources().openRawResource(
             resourceId);
      . . .

你的實現很糟糕,對我來說最好使用靜態變量是使用單例。 單例模式

現在,請記住,如果您為 Context 使用引用對象,可能某些方法可能會改變變量,而其他函數可能會受到影響。

這很“糟糕”,主要是因為不能保證您的MainActivity構造函數已被調用。 例如,如果您的流程終止然后重新創建,而另一個活動在其上方,則可能會發生這種情況。

您可以使用自定義Application子類並在其中存儲對其Context的靜態引用,無論您的應用程序如何啟動,該引用都將可用。 (例外是ContentProvider可能在您的Application子類之前實例化。)您可能希望通過靜態方法而不是靜態字段公開它。

但是,如果可能的話,將Context作為構造函數參數簡單地傳遞給Renderer會是更好的設計。

我認為如果您的應用程序在操作系統需要更多內存時丟失靜態變量的值會很糟糕,我使用onResume()方法來設置我的靜態變量上下文的值。

 public class MyApplication extends Activity{
    @Override
      protected void onResume() {
        MyApplication.context = getApplicationContext();
        super.onResume(); 
    }        
  }

你的實施很糟糕。 查看 Android 開發者博客。

避免內存泄漏

http://android-developers.blogspot.jp/2009/01/avoiding-memory-leaks.html

在這種情況下(將 Context 保留在靜態字段中),GC 不會釋放 Context 對象,直到應用程序進程被殺死。 這種模式就是所謂的內存泄漏,應該避免。

Tavian Barnes 為您提供了使用自定義 Application 子類的提示。 它是我在 android 應用程序上的技術並且工作得很好。 活動和進程內服務可以使用它。 應用程序實例是系統自動管理的單例,所有應用程序都有默認或自定義的。 我將它用於應用程序全局的事物。

AndroidManifest.xml

   <?xml version="1.0" encoding="utf-8"?>
   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.my.app"
       android:versionName="1.0" android:versionCode="3" >

       <application
          android:name=".MyApplication"
          ...
       </application>
   </manifest>

com.my.app.MyApplication

package com.my.app;
import android.app.Application;

public class MyApplication extends Application {
    @Override public void onCreate() {...}

    public void doSomething() {
        // getApplicationContext() getter is available here
    }
}

在任何活動或進程內服務類中使用此 getter (MyApplication)getApplication()

暫無
暫無

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

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