2011-01-20 37 views
0

私のプロジェクトでは、バックグラウンド操作が完了するまで待つ必要があります。それまで、進捗ダイアログが表示されます。操作が完了した後、結果はリストに格納され、リストが作成されます。Androidでエラーが発生しました

すべてが(進行状況ダイアログとすべての)正常に動作しているようだが、待機中()、私のコードは、(スタックオーバーフローで見られる)

Runnable runnable = new Runnable() { 
    public void run() { 
     // wait(); This call wouldn't work 
     synchronized (this) { 
     wait(); // This call will work 
     } 
    } 
}; 

で、バックグラウンド操作が完了した後、それがあります

public void handleMessage(android.os.Message msg) { 
      super.handleMessage(msg); 
      System.out.println("Doneee!!! Yup yes "); 
      pd.dismiss(); 
     synchronized (runnable) { 
     runnable.notifyAll(); // this call will work 
     } 
    } 

しかし、問題は、待機がハングアップしているということです。つまり、私もデバッグしようとすると、wait()は返されません。それは待ち状態にあるだけです。あなたは私にそれを手伝ってもらえますか?

ありがとうございます!

よろしく ニシン

+0

本当に同期ブロックが必要ですか? – gulbrandr

+0

私はsync文を削除しようとしました。それはエラーを返します。待機する前にオブジェクトがロックされていません。 – nithinreddy

答えて

0

あなたはその後、進行状況ダイアログを表示している場合は、うまくいけば、あなたはバックグラウンドプロセスから進捗ダイアログに進捗通知を送信しているので、「進捗ダイアログ」は「私はゴーボールなので、実際に進捗状況を表示しません」というダイアログではありません。バックグラウンドプロセスに「私は完了」通知を送ってください。

+0

いいえ、ProgressDialog.dismiss()をhandleメソッドで使用しました.5秒ごとにコメントを編集することができます(このボックスをクリックすると解除されます)。public void handleMessage(android .os.Message msg){ \t super.handleMessage(msg); System.out.println( "Doneee !!!はい"); \t pd.dismiss(); \t k = 1; }ですから、私はwait()から目を覚ますでしょうか? – nithinreddy

0

あなたが見ている問題を正確に回避するために、待機を同期させる必要があります。問題を解決するには、wait()とnotify()を呼び出すだけでなく、フラグを使用する方法もあります。 (待機する前と呼ばれるあなたが旗を持っていない場合

boolean done = false; 

... 

synchronized(this) { 
    if (!done) wait(); 
} 

... 
synchronized(this) { 
    done = true; 
    notifyAll(); 
} 

、それは(のnotifyAll可能です))され、時:終了する操作を待つ同期次のようになりますあなたが永遠に待ってしまうことを指摘する。同期化されたブロックは、完了をチェックしてからwait()を呼び出すまでの間に通知が行われないようにするために必要です。 Javaオブジェクトが存在しない場合の理由は、言語設計者がこの種のシステムが通常必要であることを微妙に思い出させているからです。

編集済み:Androidでは、ほとんどの目的のために、AsyncTaskクラスはこのようなことをすることからすべての面倒を取ります。可能な限り使用してください。

関連する問題