
[code]

    public static class DownloadWorker extends AsyncTask<Void, void ,void {
        @Override
            protected String doInBackground(Void... voids) {
                return　null;
    
[/code]


CC BY-SA 4.0
2019-12-02T10:16:11.857
61019
2019-12-04T00:16:22.830
2019-12-03T00:29:52.817
3060
36749
question
java android android-layout android-asynctask
AsyncTaskの引数のvoidの意味を教えてください


AsyncTask が取る型引数に指定されている Void の意味が知りたいのですね。

サンプルのコードはおそらく間違っています。以下が正と思われます。

[code]

    public static class DownloadWorker extends AsyncTast<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            return null;
        }
    }
    
[/code]

上記のコード中に Void は3箇所登場しました。最初の Void は _doInBackground_ の引数の型に対応します。2番目の Void は
_onProgressUpdate_ というコールバックメソッドの引数の型に対応します。ちなみに、3番目の型引数は doInBackground
の返り値の型と _onPostExecute_ の引数の型に対応します。

以上を踏まえて上記のコードを解説します。まず最初の型引数が Void なので、 doInBackground の引数は Void となります。つまり
doInBackground は引数を使った処理を行いません。2番目の型引数も Void なので onProgressUpdate の引数も Void
となり、やはり引数を使った処理を行いません。3番目の型引数は String なので doInBackground は String を返します。

ここまで得られた知識を使うと Void 以外の型を設定した場合の実装ができるようになります。簡単ですが、例えば以下のコードです。

[code]

    public static class DownloadWorker extends AsyncTask<Uri, Integer, List<String>> {
        @Override
        protected List<String> doInBackground(Uri... uris) {
            final List<String> list = new ArrayList<>();
            for (int i = 0; i < uris.count; i++) {
              final String content = HttpClient.download(uri); // HTTP 通信をしてデータをダウンロードする。実装は省略
              publishProgress((int) i + 1 / uris.count) // タスクの進捗を整数で表現する
              list.add(content);
            }
            return list;
        }
    
        @Override
        protected onProgressUpdate(Integer... progress) {
            // ProgressBar とかに進捗を表示する
        }
    
        @Override
        protected void onPostExecute(List<String> list) {
            // list を使って UI を更新する
        }
    }
    
[/code]

例外処理などは省略していますが、だいたいこんな感じです。AsyncTask doInBackground 以外のメソッドは UI
スレッドで実行される前提で作られています。そのため、型引数の仕組みを使ってスレッド間通信のコードをプログラマが実装することなく実現できます。

細かいことはリファレンスを参照してください。[AsyncTask](https://developer.android.com/reference/android/os/AsyncTask)


CC BY-SA 4.0
2019-12-04T00:16:22.830
61076
2019-12-04T00:16:22.830
7949
61019
answer