【问题标题】:How to use global class variables in android如何在android中使用全局类变量
【发布时间】:2012-10-29 10:13:42
【问题描述】:

嗨,我在这里做一个应用程序。我正在使用全局类变量。它运行良好,但如果我使用更多的 globalclass 变量,我有时会遇到内存异常。

我试过了:

  public class SecondClass extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);



    TextView tv = (TextView)findViewById(R.id.tv);
    tv.setText("Global String : " + GlobalClass.myVal);
}
 }


  class GlobalClass extends Application {

   static String myVal;

  }

这是正确的还是错误的?

【问题讨论】:

    标签: android android-emulator


    【解决方案1】:

    首先,你不需要静态变量在应用程序类中声明全局变量,

    所以将您的代码更改为:

    class GlobalClass extends Application {
    
       public String myVal;
    
      }
    

    然后,无论您需要在哪里访问此数据,都可以通过以下方式获取 Application 对象:

    GlobalClass global=(GlobalClass)context.getApplication();
    global.myVal="anything";
    

    【讨论】:

    • 扩展 Activity 是个坏主意:Activity 类在这里是为了让你显示一些东西;具有与此任务关联的完整生命周期。 Application 类被广泛用于存储全局应用程序变量,就像 @jeet 所做的那样。但是它有一个陷阱:Application 对象可能会在您的应用程序的生命周期中被销毁(主要是在系统需要内存的情况下),所以不要假设 Application 类将始终安全地保留您的所有变量,否则您会遇到奇怪的错误如果不是这样。
    • 它工作正常。现在我的应用程序内存不足异常也会出现一段时间
    • @Teovald 我应该用什么?共享偏好?
    • sharedPreferences 对于在会话之间存储简单对象非常有用。例如,如果您想在用户第一次使用应用时显示教程。
    【解决方案2】:

    你可以这样使用

    public class GlobalVar {
    
        public int getMyVar() {
            return myVar;
        }
    
        public void setMyVar(int myVar) {
            this.myVar = myVar;
        }
    
        private int myVar = 0;
        private static GlobalVar instance;
    
        static {
            instance = new GlobalVar();
        }
    
        private GlobalVar() {
        }
    
        public static GlobalVar getInstance() {
            return GlobalVar.instance;
        }
    
    }
    

    然后你就可以打电话了

    GlobalVar.getInstance().setMyVar(int);
    

    【讨论】:

      【解决方案3】:

      您还可以明智地使用全局变量活动类。比如

       public class SecondClass extends Activity {
      String S1,S2,S3;
      EditText edt1,Edt2,Edt3;
      Button btn1,btn2,btn3;
      //like this wat Declare all variable you want to use in your Present Activity Class
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
           setContentView(R.layout.second);
      edt1= (EditText)findViewById(R.id.tv);
      }
      }
      

      【讨论】:

        【解决方案4】:

        看帖子Singletons vs. Application Context in Android?

        论坛中有很多关于 Singleton 与 Application 对象的讨论。 我个人倾向于 Application 具有属性的对象。如果您不想在内存中保留大量对象,请使用 LruCache(兼容性包中有一个 pre v11 实现)来降低您的内存需求。

        考虑到使用 Singleton 与使用 Application 对象会消耗相同数量的内存,所有对象都将保留在内存中,直到您释放它们(删除对它们的任何引用并让 GC 从内存中清除它们)。

        【讨论】:

          猜你喜欢
          • 2012-08-09
          • 2013-04-19
          • 2012-12-20
          • 1970-01-01
          • 1970-01-01
          • 2012-07-01
          • 2012-06-14
          • 2021-05-23
          相关资源
          最近更新 更多