6

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

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

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

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

 }

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

4

3 回答 3

7

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

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

我不会从不同的线程做的事情是从 Context 子类(如setTheme() )访问方法,这将影响当前显示的视图。

于 2012-05-15T11:01:52.507 回答
2

如果您不需要对Views做任何事情,那么请始终尝试使用getApplicationContext()which 指的是应用程序的上下文(而不是活动的上下文),并且可以帮助您避免线程或方向更改时的内存泄漏。所以,我想它也适合您在 AsyncTask 中的需求。

于 2012-05-15T10:35:38.470 回答
1

上下文实际上不是线程安全的。但是可以传递一个应用程序上下文的实例来写入数据库,例如。

于 2012-05-15T10:36:01.040 回答