1

PDF を 1 つずつダウンロードしてビューに表示するアプリケーションを作成しています。ビューには次のボタンがあり、onClick は PDF (前の次のクリックでダウンロードされたもの) を表示し、次のボタンが再度クリックされたときに表示される次の PDF をダウンロードします。AsyncTasks を使用してファイルをダウンロードしています。ファイルごとに 1 つの AsyncTask とその中に ProgressDialog があります。ユーザーが次のボタンをクリックし、表示するファイル(前の次のクリックでダウンロードされるはずだった)がまだダウンロード中の場合、プログレスバーを表示して、ダウンロードが完了するまで待ちます。以下は私のコードのスニペットです..

public void saveFile(String uri, int index)
    {
if(!f.exists())
        {

            Downloader downloader = new Downloader(f, index);
            //adding the downloader to the list
             downloaders.add(downloader);
            downloader.execute(uri);
        }
}

ここに私がPDFを表示する方法があります

private void showPdf(){

    [...]
          if(!completed[to_show]){

              downloaders.get(to_show).mProgressDialog.show();
              }
        [...]
}

ここに私のAsyncTaskコードがあります

private class Downloader extends AsyncTask<String, Integer, String> {


    ProgressDialog mProgressDialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.show();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        completed[fileNum] = true;
        Log.e("PDFReaderAct",String.valueOf(fileNum)+" download complete");
        mProgressDialog.dismiss();
    }


    public Downloader() {
       [...]
        mProgressDialog = new ProgressDialog(PDFReaderAct.this);
       [...]
    }

@Override
protected String doInBackground(String...params ) {
            try
            {
                //Code to download the file
                    publishProgress((int) (total * 100 / fileLength));
                    os.write(bytes, 0, count);
                }
            [...]   
            }

            }

@Override
    protected void onProgressUpdate(final Integer... progress) {
        super.onProgressUpdate(progress);
        runOnUiThread( new Runnable() {

            public void run() {
                // TODO Auto-generated method stub
                mProgressDialog.setProgress(progress[0]);
            }
        });

    }

    }

このコードを実行すると、プログレスバーが表示されますが、showPdf() メソッドが実行された後です。ファイルのダウンロードごとに AsyncTasks と progressDialogs を追跡しています。以前のダウンロードの進行状況を表示するにはどうすればよいですか?

ありがとう、

4

1 に答える 1

1

ここ

private void showPdf(){

    [...]

     downloaders.get(to_show).mProgressDialog.show(); //<<get method of AsyncTask

    [...]
}

AsyncTaskについてのドキュメントと同じです。get (長いタイムアウト、TimeUnit 単位) :

必要に応じて、計算が完了するまで指定された時間だけ待機し、その結果を取得します。

AsyncTask から UI メイン スレッドに結果を戻すためにこのメソッドを使用する場合、AsyncTask の doInBackground メソッドから結果が返されなくなるまで、メイン UI の実行が停止されます。

ソリューションはonPostExecute、AsyncTask の実行が完了したときに UI 要素を更新するために使用されます

于 2012-12-17T05:03:04.293 に答える