2015-11-03 17 views
6

このクラスはフラグメントから呼び出されます。 On進行状況の更新が呼び出されますが、メッセージは更新されません。私は進行状況バーやスピナーも見ていない。タイトルとメッセージだけで、いくつかの同様の問題が見られましたが、プログレスバーがまったく表示されないところは何も見つかりませんでした。また、私のメッセージはonProgressUpdateでは一切更新されませんが、値を出力すると、onProgressUpdateの内部でインクリメントされます。進捗ダイアログで進行中のバーが表示されますが、メッセージが更新されません

編集:ここでは、私はクラス

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> { 

ProgressDialog progressDialog; 

@Override 
protected void onPreExecute() 
{ 
    progressDialog = ProgressDialog.show(getActivity(), "Downloading","Downloaded 0/"+urls.size(), false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

@Override 
protected Long doInBackground(String[] urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
      //Do things in background here 
      publishProgress(new Integer[] {i}); 
    } 
    return totalSize; 
} 

@Override 
protected void onProgressUpdate(final Integer... progress) { 
    System.out.println(progress[0]); //This does print correctly 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      progressDialog.setProgress(progress[0]); 
      progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); 
     } 
    }); 
} 

@Override 
protected void onPostExecute(Long result) { 
    progressDialog.dismiss(); 
    Toast t = Toast.makeText(getActivity(), "Downloaded", Toast.LENGTH_LONG); 
    t.show(); 
} 

}

+1

どのようにタスクを開始しましたか、コードを示してください。 – starkshang

+0

私はそれを開始する方法を示すためにそれを編集しました。それはあなたがタスクを開始する一般的な方法であり、私はそれを含まなかったのです。それはまったく役に立ちますか? – Zach

答えて

3

問題はProgressDialogが初期化される方法にあります。

は、これであなたのonPreExecuteを置き換えます

@Override 
protected void onPreExecute() { 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setTitle("Downloading"); 
    progressDialog.setMessage("Downloaded 0/" + urls.size()); 
    progressDialog.setIndeterminate(false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressDialog.show(); 
} 

は基本的に、あなたがショーを呼び出す前にsetProgressStyleを呼び出す必要があります。

onProgressUpdateがUIスレッドで呼び出されたため、onProgressUpdateにあるrunOnUiThreadコードを削除することもできます。

+0

うわー、そのような単純な問題です。ありがとう、ありがとう、賞金を授与することができます〜22時間を残す – Zach

+1

助けてうれしい - それはトリッキーなバグです。興味があれば、ProgressDialogのソースを見てください。なぜあなたはこの問題に取り組んでいたのでしょうか。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

に正確な原因の確認作業ここで

DownloadFilesTask download = new DownloadFilesTask(); 
download.execute(urls.toArray(new String[urls.size()])); 

をされていない起動方法ですが、それはsetProgressに必要とされていませんrunnableonProgressUpdateがUIスレッドで実行されます。

また

progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());

getActivity().runOnUiThread(new Runnable() { @Override public void run() { progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); } });

を交換してみは - 私たちはonPostExecute()に却下される進捗状況を見ることができない他、あなたがdoInbackground()でのネットワークのものをやっています。

+0

私は実際に前にそれを持っていたが、それは動作していなかったので、私はrunonuithreadを試してみることに決めた。私はイメージをダウンロードしていますので、しばらく時間がかかります。ダイアログには表示されますが、プログレスバーは表示されず、タイトルだけが表示されます。画像のダウンロードが終了すると、それは正常終了します。 – Zach

+0

Ok。進行状況ダイアログを最初に初期化し、 'onPreExecute()'の最後に 'show()'を呼び出すことがあります。 – sha

関連する問題