0

私は1つのスレッドについて話しています。たとえば、Activity ui と次のメソッドがあります。

/* TOP LEVEL OF EXECUTION LOOPER NOW WORKING */

class MyActivity extends Activity {
void onCreate(Bundle instance) {
 super.onCreate(instance);
 setContentView(R.layout.activity_main);
 doComplicatedStuff();
}

void doComplicatedStuff() {
 // Doing stuf
}

void onClick() {
 // Process event
}

void anyOtherMethod() {
  /* NOT TOP LEVEL OF EXEUCTION, LOOPER NOW CAN'T WORK */
}
}

/* TOP LEVEL OF EXECUTION, LOOPER NOW WORKING */

私の質問は、onClick() ハンドラーの実行によって doComplicatedStuff() を中断できますか (もちろん、クリックされたボタンがある場合) ?

これで、onClick() ハンドラーは doComplicatedStuff() が作業を終了するまで doComplicatedStuff() の実行を中断できないと思います。コード実行の最上位にルーパーがあるため、次のメッセージ イベントを受け取り、ハンドラーにディスパッチします (ハンドラーは onClick() メソッドを呼び出します)。つまり、Looper は、このスレッドで実行中のメソッドがない場合にのみ作業を行います。

4

1 に答える 1

1

あなたは正しいです。GUI スレッドは onCreate 関数でビジーになるため、アイテムをルーパーに送信したとしても、onClick メソッドを呼び出して complexStuff を中断することはできません。

実際、この種のことは、複数のスレッドが関係している場合にのみ可能です。それでも、runOnUiThread への送信が必要な場合は、実行時間の長い操作が進行中であるため、失敗する可能性があります。

complexStuff ルーチンを 2 番目のスレッドで実行することをお勧めします。長時間実行される操作は、UI スレッドに属しません。

于 2013-07-06T03:41:57.000 に答える