2016-07-06 15 views
0

アンドロイドアプリケーションの作成中古いデバイスでは遅くなるコードがたくさんあります。すべてのinitコードが実行されている間にprogressdialogの表示をしたい。 onCreateから呼び出されるとダイアログが表示されません。したがって、AsyncTaskに入る必要があります。show progressdialog asyctaskに表示されていません

これは私の仕事です。

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

    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(mainContext); 
     pd.setMessage("Starting up. Please wait..."); 
     pd.setIndeterminate(true); 
     pd.setCancelable(false); 
     pd.show(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
       pd.show(); 
       runInit(); 
      } 
     }); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (pd != null) { 
      pd.dismiss(); 
     } 
     super.onPostExecute(result); 
    } 
} 

でも、ダイアログは表示されませんか? runInitは通常のスロースタートアップコードです。 UI上で実行する必要があります。

私がpd.dismiss呼び出しを削除した場合、initコードが完了すると進捗ダイアログが表示されるので、表示されずにOKが作成されます。

上記のコードは正しい方法ですが、onCreateから呼び出されたときにはうまくいかないでしょうか?

表示するように呼び出した後にダイアログを表示する方法はありますか?どのようにしても、ダイアログが表示され、表示されるまで待ってから続行することができます。

ありがとうございました。

EDIT:私はちょうど弾丸を噛んでコードを再構成して、ゆっくりとした非UIコードだけがAsyncTaskの中に入るようにしなければなりませんでした。これでうまくいきました。

+0

は、なぜあなたは)( 'pd.showを呼び出している;' 'doInBackground'に? – Sharj

+0

ダイアログの表示を試みるだけです。それは助けになりませんでした。 – Some1Else

+1

あなたの問題は、 "runInitは通常の低速スタートアップコードです"というステートメントにあり、UIで実行する必要があります。これはasynctaskの目的を破るもので、asynctaskはUIスレッドから取り除かれます。 runInit()が何をしているのかを記述し、誰かがUIスレッドの外でそれを行う方法を見つけるのを助けることができます。 – alzee

答えて

0

あなたのrunInitは何をしていますか? UIスレッドで実行していますが、同じ方法でブロックされています。

+0

はい、runInitはUIスレッド上で実行されている必要があります。 UI3adコードを実行する前に、progressdialogを表示する方法はありますか? – Some1Else

+0

進捗状況は表示されていますが、直ちにブロックされます。UIでこれを実行してはいけません。 runInitが何をしているのかを知るために。 –

0

onPreExecute()、onPostExecute()およびonProgressUpdate()はUIスレッドにアクセスできますが、doInBackground()はアクセスしません。

runInit()がUIで何かを実行すると、ブロックされており、無視している例外が生成されている可能性があります。

doInBackgroundで操作を行い、publishProgress()を使用してUI/ProgressBarステータスに更新するonProgressUpdate()データを送信する必要があります。ここ

は例です:

new AsyncTask<Void,Object,Void>() 
{ 
    @Override 
    protected Void doInBackground(Void... params) 
    { 
     Object[] _progress = new Object[]{"Decompressing", 1}; 
     publishProgress(_progress);    
    } 

    @Override 
    protected void onPostExecute(Void params) 
    { 

    } 
    @Override 
    protected void onPreExecute() 
    { 

    } 
    @Override 
    protected void onProgressUpdate(Object... values) 
    { 
     txtProgress.setText(values[0].toString()); 
     progressBar.setProgress(Integer.parseInt(values[1].toString())); 
    } 
}.execute(); 
関連する問題