このプロジェクトで問題が発生しました:ハンドラはメインスレッド内のオブジェクトである場合には、サブスレッドロジックでコールhandler.postDelayed(新しいRunnableを())、実行中のRunnable()が実行されない場合。私を有効にするには、バックメインスレッド、handler.postDelayed(新しいRunnableを())を呼び出すようにメインスレッドにeventbusで通知されます
では、どのようhandler.postDelayed(新しいRunnableを()が)メインスレッドで実行されて判断するのですか?
:新しいRunnableを()ハンドラがスレッドを作成した場合には、ある、ハンドラスレッドを作成するために、添付のメインスレッドが実行可能であるメインスレッドで実行する必要があります。スレッドが作成されている場合ハンドラの子スレッドが実行可能である子スレッドで必要になります実行。
UIスレッドで(つまり、メインスレッド)印刷スレッドIDには確認します。
System.out.println("主线程为== " + Thread.currentThread().getId());
UIスレッドは(新しいハンドラを呼び出す)スレッドIDを実行しているプリントをpostDelayed:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("Handler 线程为 ==" + Thread.currentThread().getId());
}
}, 5000);
最後に、次の印刷:
主线程为== 1
Handler 线程为 == 1
あなたが見ることができ、それらの両方のプログラムは、メインスレッドで実行されています。
Googleの公式の説明は次のとおりです。
実行可能なこのハンドラが添付されたスレッド上で実行されます。
当然、メインスレッドに取り付けたので、実行可能、(つまり、メインスレッドである)のオープン実行可能なこのハンドラは、添付のスレッドで実行され、このハンドラは、UIスレッドで作成されたと言われています。
postDelayed(新しいRunnableを())再生成し、新しいスレッドではありません。