2011-02-25 7 views
4

プロセスの実行中にProgressDialogを使用して問題が発生しています。私はすべての間違った方法を試してみましたが、何をしようとしているのかの例を提供した多数のWebサイトを見てきましたが、ProgressDialogが現れる前にスレッドが実行されているという問題が残っています。ここでは、この時私の最新の試みです:この方法を試すことに加えスレッド問題のあるAndroid ProgressDialog

new Thread(new Runnable() { 
    public void run() { 
     dialog = new ProgressDialog(EPD.this); 
     dialog.setMessage("Loading. Please Wait..."); 
     dialog.show();   
        } 
}).run(); 
getMostWanted();      

が、私はまた、しかし、私はまだ同じ結果を持っています)(getMostWantedで新しいスレッドを試みてきました。 getMostWanted()およびダイアログボックスが表示されていない間は、約4〜5秒間停止します。

ご協力いただきありがとうございます。

答えて

0

スレッド実行時の保証はありません。代わりにAsycTaskを使用することをお勧めします。ここに例があります。その後、それを実行してプログレスバーを更新することができます。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
2

あなたがメインスレッドにしている場合は、ProgressDialogを表示し、getMostWanted()のための別のスレッドをスピンオフすることを使用する必要があります。あなたがgetMostWanted()の結末は、ダイアログを閉じたいと仮定すると、あなたはAsyncTaskをご覧ください:

private class GetMostWanted extends AsyncTask<Void, Void, Void> { 
    private final ProgressDialog dialog; 

    public GetMostWanted() { 
      dialog = new ProgressDialog(EPD.this); 
      dialog.setMessage("Loading. Please Wait..."); 
    } 

    protected void onPreExecute() { 
     dialog.show(); 
    } 

    protected void doInBackground(Void... unused) { 
     getMostWanted(); 
    } 

    protected void onPostExecute(Void unused) { 
     dialog.dismiss(); 
    } 
}

あなたの処理がdoInBackground()にバックグラウンドスレッドで実行され、その後、あなたが終わった後、あなたは、ダイアログ上を消すことができますこの方法は、メインスレッドはonPostExecute()です。

今、あなたは使用することができます。

new GetMostWanted(dialog).execute();

1

@Aminは、彼の実装は非常にあなたのニーズに適合しないが、問題にアプローチするための良い方法は、AsyncTaskであることが正しいです。 onPreExecute()にダイアログを作成し、onPostExecute()で削除します。

あなたが持っている問題は、新しいThreadを作成してからrunを呼び出すと、UIスレッドでスレッドが実行されるということです。 getMostWanted()への呼び出しもUIスレッドで実行され、ダイアログの作成がブロックされます。

は、だからあなたのオプションは、他の人とAsyncTaskを使用するようにしている示唆している、またはHandlerは、UIの更新を行いThreadHandlerを使用します。

0

ジェイ...あなたは、スレッドと手を使用したい場合Lers。時間のかかるタスクを実行可能なメソッドに配置します。実行可能オブジェクトを「含む」スレッドを作成し、スレッド開始を呼び出して、時間のかかるタスクが別のスレッドで実行されるようにします。 UIスレッドでダイアログを起動できるはずです。バックグラウンドスレッドが完了してハンドラに通知すると、UIスレッドにバインドされているハンドラ内のダイアログを閉じることができます。ここでスレッドを使用していくつかのコードです。このスニペットは、新しいスレッドで時間のかかるプロセスを起動します。

buttonConfuseText.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final String inString= editTextPlainText.getText().toString(); 
     Thread thread= new Thread(new Runnable() { 
      public void run() { 
       String outString= encrypt(password,inString); //<== time intensive task here 
       Message msg= Message.obtain(); 
       Bundle b= new Bundle(); 
       b.putString("encryptedText",outString); 
       msg.setData(b); 
       handler.sendMessage(msg); 
       Log.d(TAG,outString); 
      } 
     }); 
     thread.setDaemon(true); 
     thread.start(); 
    } 
}); 

現在地が完了するスレッドを待つ:

public class ConfuseText extends Activity { 
    private Handler handler= new Handler(){ 
     @Override 
     public void handleMessage(Message msg){ 
      super.handleMessage(msg); 
      ConfuseText.this.onThreadMessage(msg); //<== close dialog here if you wish 
     } 
    }; 

public void onThreadMessage(Message msg){ 
    Bundle b= msg.getData(); 
    String encryptedText=""; 
    if (b != null){ 
     encryptedText= b.getString("encryptedText"); 
    } 
    Log.d(TAG,encryptedText); 
} 
関連する問題