2016-12-01 4 views
0

Androidアプリケーションで次のコードを実行している間、setTextはmainActivity.notify()が別のサービスから呼び出された後に発生します。したがって、mainActivity.wait()がsetTextの前に実行されているため、setTextが待機するように見えます。Androidでwait()関数を使用しているときに同期実行する方法は?

mainActivity.wait()の前にToastを実行して、MainActivityの待機中にsetTextを表示する方法が考えられます。

public static Activity mainActivity; 
.... 
startButton.setText("Processing..."); 
synchronized(MainActivity.mainActivity) { 
       try { 
        mainActivity.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
startButton.setText("Start"); 
+0

を凍結しているのThread.sleep使用することができますか?どうして? –

+0

メイン(UI)スレッドを待機させることはできません。これには理由はなく、Androidフレームワークでは許可されません。それは応答しないためにあなたのアプリを殺すでしょう。ここで何を達成しようとしていますか? –

+0

@DavidWasser私はそれを理解しています。私のMainActivityは、サービスが処理を完了するまで1-2秒待っているので、サービスが生成した結果を表示できます。 –

答えて

3

まず、アクティビティへの静的な参照はありません。それはほぼ保証されたメモリリークです。必要があると思われる場合は、アプリ全体のアーキテクチャが間違っているか、コンテキストを使用する方法がわからない場合があります。

第2に、Androidの下では、他のGUI OSと同様に、イベントループによって駆動されます。メインスレッドを押し上げることで、イベントループが実行されなくなり、アプリケーション全体がフリーズします。特にイベントループを実行することなく、アプリケーションは決して再描画されません。

第3に、トーストが表示されるまで待つことができません。トーストはシステムそのものによって表示され、それが決まったときにはすでに画面に他のトーストがあるかもしれません。トーストが表示されたときに通知されるメカニズムはありません。トーストの目的は火と忘れです。もっと強力なものが必要な場合は、自分で書き留める必要があります。

+0

1位:私はもっと学び、それを取り除こうとします。 2nd:MainActivityは、サービスが処理を完了するまで1-2秒待っているので、サービスが生成した結果を表示できます。 第3回:私はトーストのためにそれを知っていた。しかし、ボタンのテキストを変更するなど、wait()の前に書かれていてもnotify()が呼び出された後に同様に動作します。 –

+1

サービスの終了を待つために待機と通知を使用するのは間違っています。サービスは同じスレッドを使用するので、決して起こりません。サービスの計算を通知する必要がある場合は、バインドされたサービスとコールバックを使用します。あなたはアンドロイド(または他のGUIベースのフレームワーク)のメインスレッドで待つべきではありません –

+0

ありがとうございました。そのため、サービス内に別のスレッドを作成して処理しています。私はあなたから提案された方法を見て、あなたが言ったように実装しようとします。しかし、驚きはなぜ実行が同期していないのかです。 wait()の前にsetTextを呼び出すと、なぜnotify()がサービス内から呼び出された後に実行されるのですか? –

-4

あなたは、UIスレッドを法

try { 
    Thread.sleep(1000);   
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+0

ありがとうございました。しかし、処理が完了した後、私はどのようにサービスから目を覚ますのですか? –

関連する問題