4

Android で、サービス内にランナブルを作成して実行すると、それが独自のスレッドで実行されていることがわかりますが、このスレッドは何らかの形で UI スレッドの一部ですか? つまり、ランナブルが長いプロセスを実行した場合、UI に影響するでしょうか?

編集:

private class SomeRunnable implements Runnable
{
  @Override
  public void run()
  {
    try
    {

    }
  }
}

SomeRunnable runnable = new SomeRunnable();
(new Handler()).postDelayed(runnable, 1000);
4

4 に答える 4

11

ドキュメント:

サービスは、それが宣言されているアプリケーションと同じプロセス、およびそのアプリケーションのメイン スレッドで実行されます。

別のスレッド:

Thread t = new Thread(new MyRunnable());
t.start();

UI/サービス スレッド:

Handler h = new Handler();
h.post(new MyRunnable());
于 2013-02-11T08:54:29.370 に答える
2

の一部ではありません。を呼び出して実行する新しいスレッドを意味すると思いUI threadます。Runnablestart()

a で new を開始するかどうかに関係なくThreadserviceUIスレッドの一部にはactivityなりませんjoin()( のようなものを呼び出さない限り)

編集

Runnableでオブジェクトを実行しているため、 を初期化Handlerする場所によって異なります。サービスは で実行されるため、サービスまたはアクティビティでハンドラーを初期化すると、コードが にポストされます。handlermain threadUI thread

Handlerスレッドごとに 1つのオブジェクトが必要であることに注意してください。そのため、毎回新しいものを作成する(new Handler()).postDelayed(runnable, 1000);ことは避けてください。たとえば、回避する必要があり、代わりに、サービス/アクティビティ クラスで初期化されたインスタンス変数はhandler.postDelayed(runnable, 1000);どこにありますかhandler

于 2013-02-11T08:51:21.573 に答える
0

デフォルトでは、サービスは UI スレッドで実行されます。ただし、サービスの種類とサービスのプロパティ、およびランナブルを投稿する方法によって異なります。デフォルトのスキームを使用すると、ランナブルがUIスレッドで実行されてブロックされると思います。

ランナブルを投稿してサービスを作成する方法をコードで示していただければ、正確な回答を差し上げることができます。

次のコードを使用して、ランナブルからスレッドの種類を確認できます。

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
    // On UI thread.
} else {
    // Not on UI thread.
}

それはまだ明らかではありません。UI スレッドで「new Handler()」を実行すると、runnable が UI スレッドで実行されます。runnable よりルーパーを使用して別のスレッドで「new Handler()」を実行すると、そのスレッドで実行されます。ランナブルが UI スレッドで実行される確率は 99% だと思います。コードを実行可能に配置して、どこで実行されるかを確認してください。

于 2013-02-11T08:53:45.800 に答える
0

サービスは別のプロセスまたはスレッドで生成されませんが、UI スレッドの一部であるため、ハンドラーに送信する実行可能ファイルは常に UI スレッドで実行されます。

于 2013-02-11T09:00:21.257 に答える