2016-09-16 62 views
-3

閱讀很多overkilled,overcomplicated在這裏的SO解決方案,對於這樣一個簡單的問題,如何從工作線程訪問主線程,執行一些代碼。如何從Java中的工作線程訪問主線程?

在iOS中的dispatch_get_main_queue()方法返回主線程。如何在Java?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL), ^{ 
    //do background thread stuff 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //update UI 
    }); 
}); 
+3

可能[從另一個線程主線程中運行代碼]的副本(http://stackoverflow.com/questions/11123621/running-code-in-main-thread-from-an其他線程) – Augusto

+2

您的問題中的任何鏈接都與Android沒有任何關係。 – CommonsWare

回答

0

在Android中,你不能直接訪問主線程(UI線程),但你可以在上面排隊的工作,所以你需要創建一個Handler並使用該處理後的主要工作(Runnable)線。

下面是如何可以在UI Thread使用Handler

new android.os.Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
     //Doing job here 
     } 
    }) 

,並張貼在評論中提到@CommonsWare一個例子,有訪問UI線程的另一個方式:如果你

  • 有任何View的實例,你可以使用View.post(Runnable)
  • 如果你有Activity的實例,你可以使用Activity.runOnUiThread(Runnable)

順便說一下訪問在Android的主線程比Java桌面應用程序

+0

您不需要創建'Handler',因爲任何'View'都可以使用'post()',並且通常您可以訪問其中的一個。 – CommonsWare

+0

多數民衆贊成在其他解決方案 –

+0

@CommonsWare他的問題是如何從工作線程訪問主線程,所以我認爲他沒有訪問任何視圖 –

-1

從另一個運行你的主線程代碼完全不同:

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      // Your code here 
     } 
}); 

希望這有助於

+0

好奇爲什麼downvote?說明?例如,此代碼可以很好地改變AsyncTask的'doInBackground()'方法中UI的狀態。這不是「正確」的方式嗎? – ShadowGod

相關問題