Activity クラスを拡張するクラスWifiAudioActivityを持つ Android アプリがあります。
簡単に言えば、アプリのボタンが押されるとメソッドが実行され、進行状況バーを使用してメソッドの進行状況が表示されます。
プログレス バーを表示し、AsyncTasksを使用して更新します。
問題は、メソッドの進行状況を取得するために別のスレッドで実行しているため、AsyncTaskスレッドの while ループが常に更新された進行状況の値を取得し、進行状況バーに表示できることです。ただし、進行状況バーを更新するprogessUpdate()を呼び出すと、実行中のスレッドでメソッドを設定した後、進行状況バーが更新されず、 onProgressUpdate()メソッド コードにジャンプすることさえありません。
興味深いことに、メソッドをオンにしてスレッドを実行する前に、ダミー値で進行状況を更新できます。
私のスレッドに問題があると思います - 誰でも助けてくれますか?
private ProgressDialog downloadAllDialog;
private ProgressDialog usingDialog;
private int totalDownloadSize;
private Download downloadAll;
private int totalBlocksLeft;
private boolean downloadComplete;
private boolean downloadFailed;
public void downloadAllClick(View view) //When the download all button is clicked
{
new PerformTask().execute();
}
private class PerformTask extends AsyncTask<Void, Integer, Integer>
{
protected void onPreExecute()
{
showDialog();
}
protected Integer doInBackground(Void... voi)
{
int retryCount = 0;
downloadComplete = false; //Assume the download is not complete
downloadFailed = false;
totalBlocksLeft = 0;
progressUpdater.run(); //Running method thread
publishProgress(20); //THIS DOES NOT WORK
while ((retryCount < Consts.RETRY_TOTAL) && (!(downloadComplete)))
{
int blocksDownloaded = 0;
while ((downloadComplete == false) && (downloadFailed == false))
{
blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft(); //GOT FROM THE RUNNING THREAD METHOD
publishProgress(blocksDownloaded); //DOES NOT WORK
}
...
}
return totalBlocksLeft ;
}
Thread progressUpdater = new Thread()
{
@Override
public void run()
{
downloadComplete = downloadAll.downloadAudio(totalBlocksLeft); //Download the audio
if (!(downloadComplete))
{
downloadFailed = true;
}
}
};
protected void onProgressUpdate(Integer... progress)
{
usingDialog.setProgress(progress[0]);
}
protected void onPostExecute(Integer result)
{
removeDialog();
}
}
protected Dialog onCreateDialog()
{
downloadAllDialog = new ProgressDialog(this);
downloadAllDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
downloadAllDialog.setMax(totalDownloadSize);
downloadAllDialog.setProgress(0);
downloadAllDialog.setMessage("Download All");
usingDialog = downloadAllDialog;
return downloadAllDialog;
}
}
現状では、コードの重要なビットで:
blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft(); //GOT FROM THE RUNNING THREAD METHOD
publishProgress(blocksDownloaded); //DOES NOT WORK
スレッド実行メソッドから更新された値を取得する blocksDownloaded は、進行状況に応じて更新されます。技術的には正しくないと確信していますが、AsyncTask にスレッドを配置すると、メイン メソッドで進行状況の更新を取得しながら、実際にメソッドが実行されます。したがって、進行状況バーの更新のみが機能しません。