9

各関数の「...」はどういう意味ですか? 最後の関数に「...」がないのはなぜですか?

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));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

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

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

4 に答える 4

13

モリソンが言ったように、...構文は引数の可変長リスト用ですurls複数を保持しますURL)。

これは通常、のユーザーがAsyncTask(あなたの場合)バックグラウンドでフェッチされる複数のURLを渡すなどのことを実行できるようにするために使用されます。URLが1つしかない場合は、次のDownloadFilesTaskように使用します。

DownloadFilesTask worker = new DownloadFilesTask();
worker.execute(new URL("http://google.com"));   

または複数のURLを使用する場合は、次のようにします。

worker.execute(new URL[]{ new URL("http://google.com"), 
                          new URL("http://stackoverflow.com") });

onProgressUpdate()、バックグラウンドタスクが進行状況をUIに伝達できるようにするために使用されます。バックグラウンドタスクには複数のジョブ(URLパラメーターごとに1つ)が含まれる場合があるため、タスクごとに個別の進行状況値(たとえば、0〜100%完了)を公開することが理にかなっている場合があります。あなたはする必要はありません。バックグラウンドタスクは確かに合計進捗値を計算し、その単一の値をに渡すことを選択できますonProgressUpdate()

方法はonPostExecute()少し異なります。で実行された一連の操作からの単一の結果を処理しdoInBackground()ます。たとえば、複数のURLをダウンロードした場合、それらのいずれかが失敗した場合は失敗コードを返す可能性があります。の入力パラメータは、から返すonPostExecute()値になります。そのため、この場合は両方とも値です。doInBackground()Long

doInBackground()が返された場合totalSize、その値はに渡されonPostExecute()、そこで何が起こったか、またはその他の好きな後処理をユーザーに通知するために使用できます。

バックグラウンドタスクの結果として実際に複数の結果を伝達する必要がある場合は、ジェネリックパラメーターを(たとえば、ある種のコレクション)Long以外のものに変更することができます。Long

于 2012-09-30T23:00:24.957 に答える
4

Java では、可変数のパラメーターを許可する Varargs と呼ばれます。

http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

于 2012-09-30T22:44:04.193 に答える