我养成了在编程中采用捷径的习惯,我想知道后果是什么:
在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);
. . .
答案 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()
。