[英]How could another thread's code run on the main thread?
最近,我對某些Android
API感到困惑。 這是一些簡化的說明,因為代碼有點長,這是完全正確的,但是讓我感到困惑。
我有兩個線程:UI線程和另一個稱為AThread
HandlerThread
。
mResponseHander
是在UI線程中創建的Handler
,它顯然與UI線程的循環程序相關聯。 然后,我將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)
, Runnable
將稍后在UI線程上運行,因為mResponseHandler
被mResponseHandler
到UI線程的mResponseHandler
程序。
問題是:當變量mRequestMap
和mThumbnailDownloadListener
和其他變量未在UI線程中定義而僅在AThread
定義時,為什么在UI線程中運行的上述代碼仍然正確?
當變量“ mRequestMap”和“ mThumbnailDownloadListener”以及其他變量未在UI線程中定義而僅在AThread中定義時,為什么在UI線程中運行的上述代碼仍然正確?
任何類實例(讓它們進一步使用“對象”)都駐留在JVM
heap
(而不是“在線程中”或其他任何東西)。 將new
運算符應用為
Type variableName = new Type();
在堆上分配了一塊內存,對該內存的引用存儲為variableName
值。 從現在開始,對Type
對象具有引用( variableName
或其副本)的任何對象(例如Thread
對象或實現Runnable
的對象,例如您的情況)都可以對其進行“操作”。
話雖如此,通過將Runnable
發布到與UI線程的Looper
關聯的處理程序,您可以告訴線程應使用駐留在堆中的對象完成哪些工作,並可以通過mRequestMap
和mThumbnailDownloadListener
。
供參考: Java內存模型 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.