我有点厌倦总是在我的各个类之间传递context
来处理简单的事情,例如Toast或Alert对话框,获取应用程序名称和版本,甚至只是访问我的SQLite数据库等等。其中需要Context
的实例才能运行。
我的所有Activity
都有超级课程。在这种情况下,context == this
。我有许多帮助方法,用于整理我的主要活动代码。
但是,对于其他类,例如助手,Service
s,BroadcastReceiver
等等this != context
,所以我总是需要传递额外的context
变量。
在许多情况下,即使这些其他类也在main
线程上运行。有没有办法为当前运行的线程获取正确的Context
?我正在考虑创建我自己的ThreadLocal
系统,可能在我的Application
子类中,但我不确定这是否是一种稳定的方法。
您建议您获取当前线程的上下文?
答案 0 :(得分:4)
有没有办法可以为当前运行的线程获取正确的Context?
不,因为没有这样的概念。如果您有14个活动,2个服务和一个自定义Application
子类,一次全部在内存中,它们都是主应用程序线程的“正确上下文”,因为它们的大多数方法都将被调用那个帖子。
我正在考虑创建我自己的ThreadLocal系统,可能在我的Application子类中,但我不确定这是否是一种稳定的方法。
不会。而且,它几乎可以确保你拥有the wrong context most of the time。
获取应用程序名称和版本
使用BuildConfig
警告对话框
使用显示它们的活动,因为没有其他正确答案。
答案 1 :(得分:1)
但是,对于其他类,例如
Helpers
,Services
,BroadcastReceivers
等,this != context
。
这是部分正确的:
Helper
' this != context
(如果不延长Context
)Service
' this == context
,无需传递额外的上下文变量BroadcastReceiver
' this != context
,但已传入onReceive(Context, Intent)
在许多情况下,即使这些其他类也在主线程上运行。
类不能在任何线程上运行。类实例驻留在专用进程的堆内存上,而运行线程则调用(操作)实例的方法。因此,一个线程在执行过程中可能会调用不同对象的方法,其中可能没有或最多有几个Context
个实例(例如Application
,Activity
,Service
等)。
有没有办法为当前正在运行的线程获取正确的
Context
?
从API的角度来看,Android
框架中没有这样的概念作为线程的上下文。从实现的角度来看,它是容易出错的,并且考虑到上述说法,在正在运行的线程调用不具有Context
范围的对象的方法的情况下,这是无意义的(例如Helper
)。