2016-09-21 13 views
0

2つの異なるスレッドから同じUI操作(Toastメッセージの表示)を行う必要がある状況に陥りました。違いは、最初のスレッドはアクティビティのUIスレッドであり、もう1つはバックグラウンドプロセスを実行し始めた別のスレッドだということです。問題は、Toastメッセージを表示するコードが常にUIスレッドから実行されるようにするためのベストプラクティスは何かということです。私はここに二つの可能性を見ている。Android:UI操作がUIスレッド上で確実に行われるようにするためのベストプラクティス

は、我々はそれが我々からrunOnUiThread()を使用できるため、UIスレッド上で呼ばれるように持っていることを確認

private void showToast() { 
    Toast.makeText(context, message, Toast.LENGTH_LONG).show(); 
} 

などのテストメッセージそして、我々は、このメソッドを呼び出すたびに表示するようになっている機能を持っています私たちが呼んでいる場所showToast()

Toastを表示するコードが、showToast()の方法内のUI threadで実行されるようにすることもできます。次のようなもの:

private void showToast() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(context, message, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

これはどちらが優先され、なぜですか?

+0

なぜ2番目のオプションを使用しませんか? –

+0

[Androidの更新UI要素 - ベストプラクティス?](http://stackoverflow.com/questions/21635062/android-updating-ui-thread-elements-best-practice)の可能な複製 –

答えて

1

2番目のオプションを使用します。すでにUIスレッドにいる場合、アクションは同じコンテキストで実行されます。あなたは私たちが現在、UIスレッド上にあるかどうかを判断する方法を求めている場合はReference

1

は、私はこのような方法を行うことをお勧めします。私たちはUIスレッド上にある場合

Looper.myLooper() == Looper.getMainLooper() 

これはtrueを返します。 それ以外の場合は、あなたがこの方向に、より深く検索することができます: https://developer.android.com/training/multiple-threads/communicate-ui.html

0

は、2番目のオプションを使用するに便利ですが、あなたはUIスレッドを使用するには、3種類の方法を持っているので、Androidのパターンは、あなたがスレッドで作業しているとき、AsyncTaskのスレッドを使用することをお勧めします(onPreExecute、onProgressUpdatesおよびonPostExecute)。

https://developer.android.com/reference/android/os/AsyncTask.html

関連する問題