2012-01-20 15 views
1

UIスレッドでいくつかの作業を行う必要があります。具体的にはいくつかのビューなどを設定する必要があります。これはバックグラウンドスレッドでは実行できません。プロセスはボタンをクリックすると呼び出され、完了には約1秒かかります。進行状況ダイアログを表示せずに、アプリケーションがフリーズしているかのように見えます。私はいくつかの場所でAsynTaskと進捗ダイアログを使用し、それはうまく動作します - しかしここで私は苦労しています。Android - UIスレッドで作業中に進行状況のダイアログを表示

私はシンプルで開始:

これはUIスレッド上のすべてであるとダイアログが、(期待のソートを示していないでしょうが

showDialog(DIALOG_PLEASE_WAIT); 
viewInfo.setFromGuide(true);   //this method just sets a variable 
viewInfo.setVenue(venue);    //this method does a lot of UI manipulation and takes a second or so 
showScreen(VIEW_INFO);    //this method shows the corresponding view in ViewFlipper 
dismissDialog(DIALOG_PLEASE_WAIT); 

をそれから私はこれにコードを変更:。

Handler hnd = new Handler() { 
    @Override 
    handleMessage(Message m) { 
     viewInfo.setFromGuide(true); 
     viewInfo.setVenue(venue); 
     showScreen(VIEW_INFO); 
     dismissDialog(DIALOG_PLEASE_WAIT); 
    } 
} 
showDialog(DIALOG_PLEASE_WAIT); 
new Thread() { 
    public void run() { 
     hnd.sendEmptyMessage(0); 
    } 
}.start(); 

これはまだダイアログが表示されません。もちろん、handleMessageのUIはまだUIスレッド上で実行されていますので、進捗ダイアログを表示するにはどうすればよいですか?

+0

「しばらくお待ちください」などのメッセージを持つシンプルなトースト通知を使用するよりも、私はあなたがビューの初期化は時間がかかる作るために何をしているのかわからないんだけど、を取る取る場合複雑なものが読み込まれている間、ユーザーに基本的なUIを示すことをお勧めします。 UIをロードするプログレスバーは大きなノーノです。 – Glitch

+0

UIの初期化の大部分は、ビットマップをImageViewsに設定し、(テキストの名前/値のペアの配列から)一連の属性を表示するカスタムビューをメインビューに動的に作成/追加することです。残念ながら、何かを見せてから残りの部分を読み込むのは簡単ではありません。 –

+0

ワーカースレッドでこれらのアクションを実行してから、特定のメソッドでUIを更新できないのはなぜですか? – Tudor

答えて

-1

あなたがAsyncTaskを使用しているとして、あなたはdoInBackGround内部からpublishProgress()を呼び出し、これまでUIスレッド上onProgressUpdate作品、ので、バックグラウンドで作業中にあなたがスムーズにあなたの結果を公開することができたときに呼び出されonProgressUpdateを上書きすることができます。

+0

私はあなたが何を指しているのか分かりません。 AsyncTasksはありません。すべての処理はUIスレッド上にあります。これはUIを更新することだけだからです。 –

+0

実際にあなたが@ Tudorにあなたの応答で "あなたはそれがアプリケーションの別の場所でAsynTaskで行われる"と言った...とにかくそれを使用することを検討することができます...それは多くのことを容易にします。 –

+0

私はまったく別の論理を指していました。 AsyncTaskは、アプリケーションの先頭でデータを一度読み込みます。アプリケーションの後半(おそらく1時間後)に、そのデータを使用してUIを設定して表示します(ユーザーが関連するアクションを呼び出す場合のみ)。 –

0

それは本当にa second or so to complete多分あなただけ

+0

これは解決策です!もちろん、リクエストを処理している間、ユーザーが画面上で他のアクションを開始できないようにするという追加の側面があります。ダイアログは自動的にこれを処理しますが、代わりに「有効/無効」ロジックを使用することができます。 –

+0

トーストを使って試しました - トーストは、すべてのUI設定が完了し、ビューが表示されるまで表示されません。したがって、まったく役に立たないです。 –

関連する問題