[解決済み] AsyncTaskに複数のプリミティブなパラメータを渡すには?
質問
以下のような関連する質問があります。 どのように私は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];
}
...
}
これはより柔軟性がありますが、パラメータをそれぞれの型に明示的にキャストする必要があります。この柔軟性が必要ない場合(つまり、単一のデータ型)、最初のオプションにこだわることをお勧めします、その方がわずかに読みやすいからです。
関連
-
[解決済み] android.os.NetworkOnMainThreadException' を修正するにはどうすればよいですか?
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] アプリケーションからAndroidのWebブラウザでURLを開くにはどうすればよいですか?
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み] AsyncTaskは別のクラスなので、OnPostExecute()の結果をメインアクティビティに取得するにはどうすればよいですか?
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AsyncTaskのAndroidサンプル
-
[解決済み] コンストラクタにsuper()を入れる必要はない?
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] データベースでリサイクルビューを使用する
-
[解決済み] Gmailの3分割アニメーションシナリオの完全動作サンプル?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] google-services.jsonって実際何してるの?