首页 文章

在课堂上设置全局上下文的不良做法?

提问于
浏览
1

如果我在对象的构造函数中传递上下文,如果正在创建的对象是长期居住的对象或单例,那么这可能会导致内存泄漏 . 以下示例 .

public class MyObject{
    private final Context context;

    public MyObject(Context context){
        this.context=context;
    } 
}

是否最好从getApplicationContext()设置上下文,因为它返回应用程序类的单例,而不是像引用类的实例那样的上下文?

context =  context.getApplicationContext();

3 回答

  • 5

    如果我在对象的构造函数中传递上下文,如果正在创建的对象是长期存在的对象或单例,那么这可能会导致内存泄漏

    是 . 例如,如果 ContextActivity ,一旦 Activity 被销毁,通常会被垃圾收集 . 但是,如果您从 static 字段引用它,则无法进行垃圾回收 . 除非您更新字段,否则将泄漏 Activity 及其引用的所有内容 .

    从getApplicationContext()设置上下文会更好吗?

    是 . 正如您所注意到的, Application 上下文是一个单例,它在您的过程中持续存在 . 实际上,它是"pre-leaked" . 你不能通过另一个 static 字段指向它来进一步泄漏它 .

  • 1

    Yes

    在Android上,Context用于许多操作,但主要用于加载和访问资源 . 这就是为什么所有小部件在其构造函数中都接收Context参数的原因 . 在常规Android应用程序中,通常有两种Context,Activity和Application . 它通常是开发人员传递给需要Context的类和方法的第一个:

    这意味着视图可以引用整个活动,因此可以引用您的活动所持有的任何内容;通常是整个View层次结构及其所有资源 . 因此,如果泄漏Context("leak"意味着您保留对它的引用从而阻止GC收集它),则会泄漏大量内存 . 如果你不小心,泄漏整个活动可能非常容易 .

    其他常见的android不良做法here

  • 2

    是的,我认为这很好 . 我在全球范围内使用过这样的环境

    public class AppApplication extends Application {
        private static AppApplication instance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
        }
    
        public static AppApplication getInstance() {
            return instance;
        }
    
        public Context getContext() {
            return this;
        }
    }
    

    每当我必须使用简单得到这样的上下文..

    AppApplication.getInstance().getContext();
    

    不要忘记在清单文件中添加它 .

    <application
        android:name="yourpackage_name.AppApplication">
        ...
        <activity/>
        ...
        ...
    </application>
    

相关问题