1. ホーム
  2. android

[解決済み] AsyncTaskに複数のプリミティブなパラメータを渡すには?

2023-06-28 19:19:09

質問

以下のような関連する質問があります。 どのように私はAsyncTaskクラスに2つのパラメータを渡すことができますか? などがありますが、私はAsyncTaskに複数のプリミティブをパラメータとして渡すという難題に無駄にぶつかったので、私が発見したことを共有したいと思います。この微妙な点は、既存の質問と回答では捕捉されていないので、私は私と同じ問題に遭遇した人を助け、彼らの苦痛を軽減したいと思います。

質問はこれです。私は、複数の プリミティブ パラメータ (たとえば 2 つの long) を AsyncTask に渡してバックグラウンドで実行させたいのですが、どうすればよいでしょうか?(私の答えは...しばらくの間、これと格闘した後...以下にあります。)

どのように解決するのですか?

AsyncTaskに複数のプリミティブを渡すことは(厳密には)できません。例えば myTask.execute(long1, long2) と設定しようとすると private class myTask extends AsyncTask<long, Void, Void> を対応するメソッドで設定します。

@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}

を使用すると、IDE はおそらくスーパータイプのメソッドをオーバーライドする必要があると文句を言うでしょう。あなたが使っているのは、いわゆる Varargs のメソッドシグネチャを使用していることに注意してください。 doInBackground ここで (long... params) は、paramsと呼ばれる配列に格納された、可変数のlongを受け入れる、と言っているようなものです。コンパイラやIDEのクレームが発生する原因を完全に理解しているわけではありませんが、ジェネリッククラスである Params がどのように定義されているかに関係していると思います。

いずれにせよ、プリミティブをそれぞれの非プリミティブラッパー(int => Integer, long => Long など)に正しくキャストすれば、問題なく望むものを実現することが可能です。実は、プリミティブを非プリミティブに明示的にキャストする必要はないのです。Javaがそれを処理してくれるようです。以下のようにASyncTaskをセットアップするだけです(longの例)。

private class MyTask extends AsyncTask<Long, Void, Void> {

    @Override
    protected void doInBackground(Long... params) {
        // Do stuff with params, for example:
        long myFirstParam = params[0]
    }
    ...
}

そして、このクラスを本来の目的通りに使うことができます、例えば

MyTask myTask = new MyTask();
myTask.execute(long1, long2);

また、同じ種類のプリミティブであれば、いくつでも渡すことができます。複数のタイプのプリミティブを渡す必要がある場合、これも可能ですが、上記を修正する必要があります。

private class MyTask extends AsyncTask<Object, Void, Void> {

    @Override
    protected void doInBackground(Object... params) {
        // Do stuff with params, for example:
        long myLongParam = (Long) params[0];
        int myIntParam = (Integer) params[1];

    }
    ...
}

これはより柔軟性がありますが、パラメータをそれぞれの型に明示的にキャストする必要があります。この柔軟性が必要ない場合(つまり、単一のデータ型)、最初のオプションにこだわることをお勧めします、その方がわずかに読みやすいからです。