2017-02-02 6 views
1

Androidでは、UIスレッド以外の別のスレッドからUIオブジェクトにアクセスできないと考えました。そのため、ハンドラとそのすべてが詳細をUIスレッドに伝える理由です。UIスレッド以外のスレッドからアンドロイドウィジェットリファレンスにアクセスできますか?

私は以下の簡単な例を試しました。私は作成された新しいスレッドからプログレスバーを更新しようとしました。出来た。私は例外を得ると思った。なぜ私が例外を受けなかったのか説明してください。

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-thread以外から更新された場合、UIスレッドで実行される独自の実行可能ファイルを作成します。

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

コードの詳細については、linkを参照してください。

+0

ありがとうございます。それは理にかなっている。 – Manoj

+0

人々の素敵な質問の多くはそれに疑問を持っています。 –

関連する問題