簡體   English   中英

另一個線程的代碼如何在主線程上運行?

[英]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);
        }
    });

此外,變量mRequestMapmThumbnailDownloadListener等僅在AThread定義。

我知道當我調用mResponseHandler.post(new Runnable)Runnable將稍后在UI線程上運行,因為mResponseHandlermResponseHandler到UI線程的mResponseHandler程序。

問題是:當變量mRequestMapmThumbnailDownloadListener和其他變量未在UI線程中定義而僅在AThread定義時,為什么在UI線程中運行的上述代碼仍然正確?

當變量“ mRequestMap”和“ mThumbnailDownloadListener”以及其他變量未在UI線程中定義而僅在AThread中定義時,為什么在UI線程中運行的上述代碼仍然正確?

任何類實例(讓它們進一步使用“對象”)都駐留在JVM heap (而不是“在線程中”或其他任何東西)。 new運算符應用為

Type variableName = new Type();

在堆上分配了一塊內存,對該內存的引用存儲為variableName值。 從現在開始,對Type對象具有引用( variableName或其副本)的任何對象(例如Thread對象或實現Runnable的對象,例如您的情況)都可以對其進行“操作”。

話雖如此,通過將Runnable發布到與UI線程的Looper關聯的處理程序,您可以告訴線程應使用駐留在堆中的對象完成哪些工作,並可以通過mRequestMapmThumbnailDownloadListener

供參考: Java內存模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM