最近,我对一些Android
API感到困惑。这里有一些简化的解释,因为代码有点长,这是完全正确的,但只是让我迷惑。
我有两个主题:UI线程和另一个名为HandlerThread
的{{1}}。
AThread
是在UI线程中创建的mResponseHander
,它显然与UI线程的looper相关联。然后我将Handler
传递给mResponseHandler
。
AThread
是AThread
,可以执行一些图像下载任务。在HandlerThread
中,我写了一些代码:
AThread
此外,变量mResponseHandler.post(new Runnable() {
@Override
public void run() {
if (mRequestMap.get(target) != url) {
return;
}
mRequestMap.remove(target);
mThumbnailDownloadListener.onThumbnailDownloaded(target, bitmap);
}
});
和mRequestMap
及其他变量仅在mThumbnailDownloadListener
中定义。
我知道当我调用AThread
时,mResponseHandler.post(new Runnable)
稍后将在UI线程上运行,因为Runnable
被关联到UI线程的looper。
以下是一个问题:当UI线程中未定义变量mResponseHandler
和mRequestMap
以及其他变量时,为什么上面的代码在UI线程中运行仍然正确,但仅在{{ 1}}?
答案 0 :(得分:2)
为什么当UI线程中没有定义变量“mRequestMap”和“mThumbnailDownloadListener”以及其他未在AThread中定义时,UI线程中运行的代码仍然正确?
任何类实例(让我们进一步使用“object”)都驻留在JVM
heap
中(不是“在线程中”或其他任何东西)。将new
运算符应用为
Type variableName = new Type();
在堆上分配一块内存,对内存的引用存储为variableName
的值。从现在开始,任何对象(例如Thread
对象或实现Runnable
的对象,就像您的情况一样)具有{{1}的引用(variableName
或其副本)对象,可以“操作”它。
话虽如此,通过将Type
发布到与UI线程的Runnable
关联的处理程序,您告诉线程应该对驻留在堆中的对象执行什么作业,并且可以由Looper
和mRequestMap
推荐。
供参考:Java Memory Model。