Android上下文线程安全吗?

Android上下文线程安全吗?,android,Android,当我在AsyncTask#doInBackground中使用Android上下文时,它是线程安全的吗?上下文是通过构造函数或周围活动的getApplicationContext()提供的。这个简单的问题在stackoverflow和其他地方被问了很多,但我没有找到一个明确的答案 例如,在doInBackground()中,我使用上下文来实例化一个DAO类 @Override protected Void doInBackground(Void... params) { Examp

当我在AsyncTask#doInBackground中使用Android上下文时,它是线程安全的吗?上下文是通过构造函数或周围活动的getApplicationContext()提供的。这个简单的问题在stackoverflow和其他地方被问了很多,但我没有找到一个明确的答案

例如,在doInBackground()中,我使用上下文来实例化一个DAO类

 @Override
 protected Void doInBackground(Void... params) {  

   ExampleDao dao = new ExampleDao(context);
   ...

 }

我看到了几个这样做的例子,但我无法想象这是线程安全的,因为上下文现在由主线程(UI线程)和工作线程访问

如果您不需要对视图执行任何操作,请始终尝试使用
getApplicationContext()
,它引用应用程序的上下文(而不是活动的上下文),可以帮助您避免线程或方向更改时的内存泄漏。所以,我想它也适合您在AsyncTask中的需要。

上下文实际上不是线程安全的。但是,例如,传递应用程序上下文的实例以写入db是可以的。

只要不更改某些内容,并且只通过上下文检索资源,您就可以从不同的线程访问上下文。我认为线程安全性没有问题

问题是,只要线程运行,上下文就会留在内存中并处于活动状态。这对您来说是一件好事,因为您可以始终依赖于有效的上下文。 糟糕的是,如果您将一个活动作为上下文传递,那么该活动中的所有视图和成员变量也将保留在内存中,这可能会导致对大量内存进行非常晚的垃圾收集,就像Waqas建议的那样


我不想从其他线程访问上下文子类中的方法,因为这样会影响当前显示的视图。

请您再核实一下,您到底在做什么?为什么不应该是线程安全的?工作线程使用上下文访问文件系统,UI线程使用上下文访问所有与UI相关的内容。访问同一资源等的混合调用不应该有问题。就我个人所知,您能再解释一下“上下文不是线程安全的”吗?我的意思是,为什么不呢?我的意思是从两个不同的线程访问上下文,在我的示例中,从UI线程和工作线程访问上下文。从写-读操作同步的意义上讲,它不是线程安全的,因为没有任何线程安全。但由于您不编写任何内容,因此可以从不同的线程使用它。这意味着我可以在工作线程中从UI线程访问上下文无关的内容?听起来不错,因此您更喜欢使用getApplicationContext()不是将整个活动传递给AsyncTask?是的,传递应用程序上下文不会对您造成任何伤害,也不会保护您免受奇怪的内存问题的影响,这些问题在java中很难找到。