2016-08-27 81 views
0

這不是關於能夠在主/ UI線程中調用方法但能夠立即執行的問題。是否有一種方法幾乎可以即時從後臺線程調用UI線程中的方法?

據我所知,由於UI響應需求,您通常不被允許直接與UI線程交互。這將是有道理的,然後有一個系統到位排隊主線程的請求,我們確實有系統與活套,處理程序等。

這是我做的: 我做了一些任務在後臺線程,我想盡快函告主線程的條件得到滿足(我創建了它監聽)我用的是響應處理後it..something這樣的:

if(mNoOfPendingRequests >= mNoOfRequestsConsideredEnough){ 
      mShouldFlagEnoughRequestsAtATime = true; 
      Log.i("ThumbnailDownloader: ","Enough Requests Queued"); 
      //Now inform about this to PhotoGallery right now 
      mResponseHandler.postAtFrontOfQueue(new Runnable() { 
       public void run() { 
        mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime); 
       } 
      }); 
     } 
     else{ 
      mShouldFlagEnoughRequestsAtATime = false; 
      mEnoughRequestsListener.onEnoughRequestsQueued(mShouldFlagEnoughRequestsAtATime); 
     } 

如果我不通知PhotoGallery有關已發送足夠多的請求,它會繼續發送越來越多的請求,並且應用程序變得無法響應。

此外,請求排隊並稍後執行,導致請求過多。因此

我的問題是:

有沒有辦法來調用一個方法/從後臺線程在UI線程通知幾乎是瞬間?

回答

0

您可以運行在UI線程的事情這樣做:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     // put your code here :) 
    } 
}); 
+0

ummmm ...創建兩個新對象,只是要在UI線程上發佈一些東西? –

1

有沒有辦法來調用一個方法/從後臺線程在UI線程通知幾乎是瞬間?

不是。您的postAtFrontOfQueue()與您可以獲得的差不多,並且如the docs中提到的黑體字註釋所述,「此方法僅適用於非常特殊的環境 - 它可能容易使信息隊列捱餓,導致訂購問題或出現其他意外方面效果 - 「。

如果我不通知PhotoGallery有關已發送足夠多的請求,它將繼續發送越來越多的請求,並且應用程序變得無法響應。此外,請求排隊並在稍後執行,導致請求過多。

在你的隊列中有更多的智能,知道何時根據你的「足夠」的算法阻止請求處理。

+0

閱讀你所說的話和我一直在猜測的內容......如果有一種方法可以在主線程上瞬時執行任務,它肯定會被像「我」這樣的人濫用。沒有太驚奇的是找不到方法。無論如何,謝謝你的迴應。 –

+1

請注意UI線程上的postAtFrontOfQueue!它可以像長時間運行的任務一樣輕鬆地捱餓。 –

0

這種方法就像一個魅力,除非你已經在你的事件隊列中有很多事件。
activity.runOnUiThread(new Runnable(){ public void run(){ //在這裏調用你的方法 } });

0

是的,你可以調用使用活動情境

runOnUiThread()並通過Runnable對象和寫入內部的run()方法的代碼。

0

從代碼中不清楚onEnoughRequestsQueued的作用。如果所有它做的是告訴張貼線程,它應該停止發送請求,那麼你大概可以完成同樣的事情用一個簡單的volatileboolean

如果線程入隊請求停止這樣做,當變量是真實的,後臺線程將其設置爲true,並且變量爲volatile,您應該很好。

相關問題