2017-02-02 33 views
1

在Android中,我認爲我不能從UI線程以外的其他線程訪問UI對象。這就是爲什麼處理程序和所有那裏溝通細節回到UI線程。我可以從UI線程以外的其他線程訪問android widget引用嗎?

我試過下面的簡單例子。我試圖從創建的新線程更新進度欄。有效。我以爲我會得到例外。你能解釋一下爲什麼我沒有得到例外。

public class Main3Activity extends AppCompatActivity { 

    private static final String TAG = "Main3Activity"; 

    Thread thread; 
    private ProgressBar progressBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main3); 

     thread = new Thread(new MyThread()); 

     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     Log.i(TAG, "run: "+Thread.currentThread().getName()); 

     thread.start(); 

    } 

    class MyThread implements Runnable{ 

     @Override 
     public void run() { 
      Log.i(TAG, "run: "+Thread.currentThread().getName()); 
      for(int i=0; i<100; i++){ 
       progressBar.setProgress(i); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

回答

1

ProgressBar在更新進度之前在內部檢查它是否在UI線程中。

如果進度從非ui線程更新,那麼它會使它自己的runnable在UI線程上運行。

if (mUiThreadId == Thread.currentThread().getId()) { 
// update progress bar 
} else { 
// create ui thread before updating progress bar 
} 

有關代碼詳細信息,請參閱link

+0

謝謝。這說得通。 – Manoj

+0

很好的問題很多人對此有懷疑。 –

相關問題