0

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 にスレッドを配置すると、メイン メソッドで進行状況の更新を取得しながら、実際にメソッドが実行されます。したがって、進行状況バーの更新のみが機能しません。

4

2 に答える 2

1

AsyncTask を適切に使用していないようです。おそらくprogressBarの更新をブロックしているUIスレッドでダウンロードコードを呼び出しているようです。

以下を提案できます。これにより、AsyncTask を適切に使用していることを確認できます。AsyncTask を適切に使用すると、コードも大幅に簡素化されます。

  1. スレッドを作成せず、runOnUIThread メソッドを使用しないでください。AsyncTask は、適切なスレッドで実行されるコールバック メソッドを提供します。
  2. メインのダウンロード コードは doInBackground メソッドにある必要があります。
  3. ダウンロード コード内のどこかで、publishProgress を呼び出す必要があります。
于 2012-08-16T14:22:05.850 に答える
0

電話する必要があります

progressUpdater.start(); 

それ以外の

progressUpdater.run(); 
于 2012-08-17T09:43:08.650 に答える