在类之间传递上下文引用的正确方法是什么?

时间:2015-07-29 04:06:44

标签: android android-context

在我的应用程序中,我在不同的地方引用上下文,包括Intent,访问资源,文件操作,AlertDialog等。而且很难在不同的类中传递当前上下文。所以我尝试在启动器活动中的单例类中设置应用程序基础上下文。因此,在启动应用程序时,我正在获取应用程序上下文并将其设置为类。后来我指的是该上下文的相同实例。但在某些地方,例如AlertDialog,如果我使用基本上下文,则会出错。那么,将上下文保持在一个公共位置并访问相同而不是在不同类之间传递当前上下文是一种好的做法吗?或者在不同类之间进行通信时传递上下文的优先方式是什么?

这是我获取上下文的课程

public class AppContext extends Application {
    private static Context sContext = null;
   @Override
    public void onCreate() {
        super.onCreate();
        sContext = getApplicationContext();
    }

    public static Context getContext() {
        return sContext;
    }
}

2 个答案:

答案 0 :(得分:5)

  

但是在某些地方,例如AlertDialog,如果我使用基本上下文

,则会出错

不允许您显示应用程序上下文中的对话框。您只能使用Activity上下文来执行此操作。

  

那么,将上下文保持在一个公共位置并访问它而不是在不同类之间传递当前上下文是一种好的做法吗?

这取决于上下文的类型。如果这是一个应用程序上下文,您可以将其存储在一个单例中,如果您真的想要。如果它是一个Activity上下文,你应该通过引用传递它,并在将该引用存储到某处时要小心,以避免内存泄漏。

  

或者在不同类之间进行通信时传递上下文的优先方式是什么?

Context作为参数传递是可以的。只要可以安全地存储对此Context的引用,就可以存储它。

例如,启动AsyncTask并保持对Activity上下文的引用是不安全的,因为AsyncTask有自己的生命周期,它会阻止Activity从屏幕旋转时收集的垃圾。这将导致内存泄漏。在这种情况下,最好有一个WeakReference到活动上下文。

所以,我的观点是,您可以将上下文作为参数传递到任何您想要的位置。如果你想保持对上下文的引用 - 小心。

答案 1 :(得分:-1)

您可以创建一个setter方法,为其参数接收Context,然后在所需的类中为其Context插入this

从那里开始,无论你在哪个班级,都应该能够使用Context,因为你将它存储为变量。

或者,如果您不想这样做,您也可以这样做:

public static Context contextA;

    @Override
    public void onCreate()
    {
        super.onCreate();
        contextA = this;
    }

两者都应该可以正常工作。