Android getContext基于当前线程? (ThreadLocal的?)

时间:2016-10-26 20:50:46

标签: android android-context

我有点厌倦总是在我的各个类之间传递context来处理简单的事情,例如Toast或Alert对话框,获取应用程序名称和版本,甚至只是访问我的SQLite数据库等等。其中需要Context的实例才能运行。

我的所有Activity都有超级课程。在这种情况下,context == this。我有许多帮助方法,用于整理我的主要活动代码。

但是,对于其他类,例如助手,Service s,BroadcastReceiver等等this != context,所以我总是需要传递额外的context变量。

在许多情况下,即使这些其他类也在main线程上运行。有没有办法为当前运行的线程获取正确的Context?我正在考虑创建我自己的ThreadLocal系统,可能在我的Application子类中,但我不确定这是否是一种稳定的方法。

您建议您获取当前线程的上下文?

2 个答案:

答案 0 :(得分:4)

  

有没有办法可以为当前运行的线程获取正确的Context?

不,因为没有这样的概念。如果您有14个活动,2个服务和一个自定义Application子类,一次全部在内存中,它们都是主应用程序线程的“正确上下文”,因为它们的大多数方法都将被调用那个帖子。

  

我正在考虑创建我自己的ThreadLocal系统,可能在我的Application子类中,但我不确定这是否是一种稳定的方法。

不会。而且,它几乎可以确保你拥有the wrong context most of the time

  

获取应用程序名称和版本

使用BuildConfig

  

警告对话框

使用显示它们的活动,因为没有其他正确答案。

答案 1 :(得分:1)

  

但是,对于其他类,例如HelpersServicesBroadcastReceivers等,this != context

这是部分正确的:

  

在许多情况下,即使这些其他类也在主线程上运行。

类不能在任何线程上运行。类实例驻留在专用进程的堆内存上,而运行线程则调用(操作)实例的方法。因此,一个线程在执行过程中可能会调用不同对象的方法,其中可能没有或最多有几个Context个实例(例如ApplicationActivityService等)。

  

有没有办法为当前正在运行的线程获取正确的Context

从API的角度来看,Android框架中没有这样的概念作为线程的上下文。从实现的角度来看,它是容易出错的,并且考虑到上述说法,在正在运行的线程调用不具有Context范围的对象的方法的情况下,这是无意义的(例如Helper)。