2012-01-11 17 views
0

データベースを更新しているうちに進行状況ダイアログを表示したい。私の問題は、ProgressDialogが4-5秒後に表示されるのが遅くなり、非常に高速に表示され、消えてしまうことです。数ミリ秒の画面でほとんど見ることができず、新しいデータがすぐにリストに表示されます。これはProgressDialogがデータベースを更新するのを待っていると思っています(約4.5秒ほどかかることはありません)。その後、画面に表示されますが、非常に速く終了します。 ProgressDialogがすぐに表示され、「更新」ボタンを押して画面に約4〜5秒間留まりたいと思います。私はそれを呼び出すProgressDialogが遅すぎると表示が遅すぎる

class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 

     ProgressDialog myprogsdial; 
     @Override 
     protected void onPreExecute(){ 
      myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 

         RefreshDataBase(); 

        } 
       }); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
      myprogsdial.dismiss(); 
     } 

    } 

new MyAsyncTask().execute();

+0

あなたはあなたが何をしているのかわからないようです...なぜあなたは 'doInBackground'で' runOnUiThread'を使用していますか?あなたのコードフローは次のようになります:私はuiスレッド(runOnUiThread)でジョブを実行する新しいスレッド(AsyncTask)を開始しています – Selvin

+0

新しいMyAsyncTaskを呼び出す前にProgressDialog.show(...) ).execute()を呼び出し、元のコードの中で最終的な参照を(進行状況ダイアログに)保持しますか? – bgs

答えて

1

this answer of Vladimir Ivanovを使用して解決しました。 外観によって機能を分離しました。 私はdoInBackground()onPostExecute()に機能を保存しました(新しいデータをダウンロードしています)setListAdaper()notifyDataSetChangedという新しいアダプタを入手しました。 もちろん、runOnUiThread()を使って終了しました。ヒントのためにすべてのおかげで。

5

[OK]を私はこの

runOnUiThreadは(新しいRunnableを(){

この動作を引き起こしていると思います。

doInBackground()はコードを新しいthreで実行します広告をメインのUIスレッドに送信します。このスレッドで実行するコードをメインスレッドに戻すと、進行状況ダイアログが最後に遅れ、postExecute()で直ちに終了します。

良いasyntaskチュートリアルはここで見つけることができます。

2

runOnUiThreadは使用しないでください。あなたは基本的にやっているのは次のとおりです。

  1. あなたはUIスレッドに実行時間の長いタスクを投稿この新しい非UIスレッドから新しい非UIスレッド
  2. を開始。
  3. 非UIスレッドを終了します。
  4. あなたのUIスレッドは、長時間実行される操作(RefreshDataBase)を実行し、UIをブロックします。

RefreshDataBase()に直接電話する必要があります。そしてこのメ​​ソッドがUIに触れるなら、それをリファクタリングする必要があります。

+0

私は 'RefreshDataBase'を直接呼び出そうとしましたが、クラッシュしました:'原因:java.lang.RuntimeException:Looper.prepare() 'を呼び出さなかったスレッド内でハンドラを作成できません。どういう意味ですか、私はそれをリファクタリングする必要がありますか? – AlexAndro

+0

これは、UIスレッド(または少なくともLooperスレッド)上で実行されるべきものを使用しているからです。 – inazaruk