在MainActivity中引用其他类的静态Context是不是很糟糕?

时间:2014-07-19 16:24:55

标签: java android static

我养成了在编程中采用捷径的习惯,我想知道后果是什么:

在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);
      . . .

5 个答案:

答案 0 :(得分:2)

你的实现很糟糕,对我来说,使用静态变量是使用Singleton。 Singleton Pattern

现在,请记住,如果你正在使用Context的引用对象,可能有些方法可能会改变变量,而其他函数可能会受到影响。

答案 1 :(得分:1)

它“糟糕”主要是因为无法保证您的MainActivity构造函数已被调用。例如,如果您的流程终止然后在另一个活动高于它时重新创建,则会发生这种情况。

您可以使用自定义Application子类并将静态引用存储到其Context,无论您的应用如何启动,都可以使用该引用。 (例外情况是ContentProvider可以在Application子类之前实例化。)您可能希望通过静态方法而不是静态字段来公开它。

但如果可能的话,将Context作为构造函数参数传递给Renderer会更好。

答案 2 :(得分:1)

如果你的应用程序在操作系统需要更多内存时会丢失静态变量的值,我认为会很糟糕,我使用onResume()方法来设置我的静态变量上下文的值。

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

答案 3 :(得分:1)

你的实施很糟糕。查看Android开发者博客。

避免内存泄漏

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

在这种情况下(将Context保留在静态字段中),GC在应用程序进程被终止之前不会释放Context对象。这种模式就是所谓的内存泄漏,应该避免使用。

答案 4 :(得分:1)

Tavian Barnes为您提供了使用自定义Application子类的提示。它是我在Android应用程序上的技术,工作得很好。活动和进程中服务可以使用它。应用程序实例是系统自动管理单例,所有应用程序都具有默认或自定义应用程序。我将它用于app-global。

<强>的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.MyApplication;
import android.app.Application;

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

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

在任何活动或进程服务类中使用此getter (MyApplication)getApplication()

相关问题