当我在AsyncTask#doInBackground中使用Android Context时,它是否是线程安全的?上下文是通过构造函数或来自周围Activity的getApplicationContext()提供的.这个简单的问题在stackoverflow上被问到了很多问题,但在哪里我发现不是一个明确的答案?
例如,在doInBackground()中,我使用上下文来实例化DAO类.
@Override
protected Void doInBackground(Void... params) {
ExampleDao dao = new ExampleDao(context);
...
}
Run Code Online (Sandbox Code Playgroud)
我看到了几个这样做的例子,但是我无法想象这是线程安全的,因为现在主要的脚步(UI线程)和工作线程访问了上下文.
只要您没有更改某些内容并且只通过上下文检索资源,您始终可以从不同的线程访问上下文我没有看到Thread-safety的问题.
问题是只要线程运行,上下文将保留在内存中并处于活动状态.这对你来说是件好事,因为你可以一直依赖有效的上下文.糟糕的是,如果你将一个Activity作为一个上下文传递,那么来自这个活动的所有视图和成员变量也将保留在内存中,这可能导致很多内存的垃圾收集非常晚,如Waqas建议的那样.
关于我不会从另一个Thread做的事情是从Context子类访问方法,如setTheme(),它将影响当前显示的视图.
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |