Android/AsyncTaskの第1引数についての疑問

このQ&Aのポイント
  • AndroidのAsyncTaskの第1引数について疑問があります。
  • executeで引数を渡さないのになぜ引数を受け取れるのでしょうか?
  • また、自分で好きに型を選択できるということはどういう意味なのでしょうか?
回答を見る
  • ベストアンサー

Android / AsyncTaskの第1引数

■コード Hoge hoge = new Hoge(); hoge.execute(); public class Hoge extends AsyncTask<Object, 第2引数, 第3引数> {  protected List<Piyo> doInBackground(Object... params) { ■質問1 ・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか? (doInBackgroundメソッド引数として受け取っているで合っている?) ・処理の流れ的には、executeで渡した引数がdoInBackgroundメソッド引数となり、その型をAsyncTask第1引数で指定している? ・それとも、executeで渡す引数の型をAsyncTask第1引数で指定しているから、予め指定された型のみをdoInBackgroundメソッド引数として受け取れる? ■質問2 ・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか? >冒頭の型変数のParamsはdoInBackgroundメソッドの引数で、自分で好きに型を選択できる >execute()メソッドの引数に渡されたものがこのdoInBackgroundのparamsとして渡ってくる ・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる? ・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる? http://d.hatena.ne.jp/Nagise/20120309/1331265123

  • re97
  • お礼率80% (601/744)
  • Java
  • 回答数2
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

こんにちは >executeで引数を渡していないに executeの引数は可変長です。 つまり、引数なしでもいいですし、1個でも2個でも3個でもOKです。 http://developer.android.com/reference/android/os/AsyncTask.html 同様に、doInBackgroundの引数も可変長です。 つまり、executeで渡された引数と同じものが、そのままdoInBackgroundに渡される仕組みです。 ですから、 hoge.execute(); とした場合は、引数はありませんから、doInBackgroundでも何も受け取れません。 >・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか? >・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる? >・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる? どちらも違います。 「executeの引数として、好きな型を使用できる」ということですね。 もちろん、doInBackgroundで受け取れる型も同じ型になります。勝手に変更されたりはしません。 どんな型を使用するのかはクラスの定義時に指定します。質問者さんが、「AsyncTask第1引数」とおっしゃっている場所ですね。 正式には、引数ではないので、「第一引数」とは呼びません。 「ジェネリック」で調べると、いろいろ詳しいことがわかると思います。

re97
質問者

お礼

回答ありがとうございました。 ・「execute」「doInBackground」、何れの引数も可変長なんですね ・勉強になりましたー

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

■質問1 > ・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか? execute()を引数無しで呼んだら、doInBackground()にも引数は渡りません。その場合はparams.lengthが0になります。 ■質問2 > 「自分で好きに型を選択できる」とはどういう意味なのでしょうか? この場合の「自分」はAsyncTaskを継承したクラスを作る人です。execute()およびdoInBackground()の引数の型を、AsyncTaskを継承したクラスの作成時に決められます。 Androidフレームワークで予め決定された型のみ使えるという仕組みではない、ということです。 > ・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる? こちらの意味です。execute()の引数の型も同時に指定されますから、指定した型と互換性のない値はexecute()に渡せません。 質問文にあるようにObjectが指定された場合は、Object型の変数に代入できるものなら何でもexecute()の引数に使えてしまうわけですが。

re97
質問者

お礼

回答ありがとうございました。 >execute()を引数無しで呼んだら、doInBackground()にも引数は渡りません。その場合はparams.lengthが0になります ・勘違いしていたことに気が付きました >この場合の「自分」はAsyncTaskを継承したクラスを作る人です。execute()およびdoInBackground()の引数の型を、AsyncTaskを継承したクラスの作成時に決められます ・この説明大変分かりやすかったです ・参考になりましたー

関連するQ&A

  • メソッド(Object... params)

    ■環境 Android(Java) ■前提 HogeClass hoge = new HogeClass(); hoge.execute();  public class HogeClass extends AsyncTask<Object, Integer, List<Item>> {   @Override   protected List<Item> doInBackground(Object... params) { ・引数の「...」初めて見ました ・調べたら、可変長引数、と書いていました ■質問1 ・「...右のparams」は、ユーザーが任意でつけて良い文字列でしょうか? ■質問2 ・executeで引数指定していないので、doInBackgroundには引数は渡っていない、と考えて良いでしょうか? ■質問3 ・executeで引数指定していないのにdoInBackgroundで可変長引数対応している理由は、このメソッド元である抽象メソッド「doInBackground (Params... params)」が可変長引数形式になっているためでしょうか? http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...) ■質問4 ・この場合の「AsyncTask<Object」は何をしているのでしょうか? ・可変長引数で、0個以上の引数を受け付ける際、その型がObjectであることを保障しているだけでしょうか? ・つまり、絶対にObject型の引数を渡すなら、この記述は省略しても良いのでしょうか? ■質問5 ・ジェネリクスの使い所について ・型を絶対に保障したい時ってどんなときでしょうか? ・基本的にどんな時でも型は保障した方が良いと思うのですが、そうするとジェネリクスだらけにならない?

    • ベストアンサー
    • Java
  • 匿名クラス内のメソッドをオーバーライド。実引数はいつどこから来るのでしょうか?

     お世話になっております。 匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが File d = new File("F:\\dir"); File[] d2 = d.listFiles(new FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt"); } } ); オーバーライドしたacceptメソッドの仮引数のFile型のhogeがありますが このacceptメソッドの実引数はいつどこから来るのでしょうか? このacceptメソッドの実引数はどこで「acceptメソッドの呼び出し」で指定すればよいでしょうか? その他ActionEvent e などの仮引数も謎です。 どうかよろしくご指導お願いいたします。

    • ベストアンサー
    • Java
  • new クラス名(Activity名.this);

    Android ・下記のようなコードがあるのですが、このとき「.this」の意味を教えてください ・Activityクラス自身? ・「.」で繋いでいる意味も、「this」の意味も良く分かりません ・thisだけでは駄目? ・引数は1つ? public class Hoge extends Activity {  public class C1 {//インナークラス?   protected m1method(略) {   略 = new クラス名(Hoge.this);

    • ベストアンサー
    • Java
  • C言語の文法(変数宣言)について

    C言語の文法の質問をさせていただきます。 int hoge; などと宣言しますが、このintというのは型指定子というものでしょうか。 int *piyo; という宣言のintも型指定子でしょうか。 この場合、* はなんと呼ばれるのでしょうか。(アスタリスクという記号です、という回答は期待していません。(^_^;)) ポインタ宣言子、でいいのでしょうか。これは「演算子」ではないんですよね? char c[10]; という宣言の[ ]やその中に入っている10はなんと呼ばれるのでしょうか。 いま、手元に「新ANSI C言語辞典」という本があるのですが、説明を読んでもよくわかりません。

  • インターフェースを持つenum定数を引数にする方法

    jdk5を利用しています。 特定のIFを持つenum定数が、複数あります。 例.IHogeをもつenum定数 public enum Hoge implements IHoge { HOGE1(1),HOGE2(2),HOGE3(3); private int no = 0; private Hoge(int no) {this.no = no;} /* IFのMethod */ public int getNo(){return no ;} } enum定数を使用して、下のような処理を行っています。 class A { public void a(){ this.c.setClass(Hoge); for(IHoge iHoge : Hoge.values()) { this.setHogeX(iHoge.getNo()); } } public void b(){ //別のenum定数の処理 } } 現在、enum定数毎に、別々のメソッドを用意して対応していますが、 処理が、全く同じな為、一つのメソッドにしたいと思っています。 IFを持つenum定数を、引数にしたいのですが、どのように記述すればよいか分りません。 public void a(Class<? extends Enum> hoge) {} 上の宣言だと、enum定数は通りますが、IFは渡せません。 本などを調べましたが、見つける事が出来ませんでした。 ご存知の方、ご教授よろしくお願いいたします。

  • Android / 型変数へのバインド?

    下記のようなコードがあるのですが、意味が分からないので教えてください arrayAdapter = new ArrayAdapter<Hoge>(this,R.layout.listview); listView.setAdapter(arrayAdapter); 1.< >に入れる内容は? ・ここにはStringなどの型を入れると思っていたのですが、このコードではユーザー定義したHogeクラスを入れています ・< >に入れて良い内容は、どういう風に決められているのでしょうか? ・また、この場合、どういう意味になるのでしょうか? ■Hogeクラス内容 ・プロパティ … データベーステーブルやカラム名を定数宣言 ・メソッド … レコード取得する(?)セッター、ゲッター ・リストビュー … 上記メソッドを使ったリストビュー

  • protectedメソッドが使用できる範囲

    protectedメソッド(もしくはコンストラクタ)はサブクラスからであればアクセスできると覚えていたのですが、以下のような使い方だとサブクラスから見えなくなるようです。 サブクラスでも別パッケージからは参照できないのでしょうか。 ------------------------- package sample.a; import sample.b.*; public class Main2 { public Main2() { } protected Main2(int a){ }     protected void hoge(){ } } -------------------------- package sample.b; public class Main extends Main2{ public void hoge(){ Main2 m2 = new Main2(1);//ここでエラー m2.hoge(); //この使い方もエラー } } -------------------------------

    • ベストアンサー
    • Java
  • C#の動的キャスト

    いつもお世話になっています。 C#の動的キャストに関する質問です。 C#のメソッドにobjectの引数を渡して動的にキャストする場合 void Hoge(object obj) { Type t = Type.GetType(obj); objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1) ................................. } のようにされています。 しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。 逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。 そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか? GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。 よろしくお願いします。

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • Java 可変長引数と優先度

    Java 可変長引数と優先度  こんにちは。c#初心者兼、java始めました です。  可変長引数の場合のオーバーロードの優先度について困っています(質問と言うより半分愚痴です)。  javaにも可変長引数ってありますよね。(ジェネリックの弱さにイライラしていたけれど)「javaも捨てたものじゃない」と感心しながら使っていると、いきなりコンパイルエラー。  sampleMethod(10, 20); と書いている部分でエラーが発生していました。  自分のメソッド定義を確認しみると、  void sampleMethod(int...);  void sampleMethod(Object...);  の2種類のオーバーロードがあり、ambiguousなため判別不能らしいです。    確かに、AutoBoxingされれば、int...だけでなく、Object...にもマッチしますが、どう考えてもBoxingしない方が優先度が高いはずです。というか、高く設定されるべきです。  個人的に基準にしているc#ではこのようなことは起きませんでした。  (あ、やっぱり捨てたものかもしれない ←心変わり早す(ry )    試しにc#でInteger型のクラスを作り、(実際はタブーですが)暗黙のキャストを双方向でオーバーロードして実験してみました。   public class Integer // ここからc# {   private int _value;   //----------------------------   public Integer(int value) { _value = value; }   //----------------------------   // Integer → int の暗黙の型変換   public static implicit operator int(Integer value)   { return value._value; }   // int → Integer の暗黙の型変換   public static implicit operator Integer(int value)   { return new Integer(value); }   //----------------------------   // javaの sampleMethod(int... values)に相当   public static void SampleMethod(params int[] values) { }   // javaの sampleMethod(Object... values)に相当   public static void SampleMethod(params Object[] values) { } }  そして、Integer.SampleMethod(10, 20); と書いてみると……問題……なし。  ちゃんと、SampleMethod(param int[] values)が選ばれていました。  つまり、(個人的には)java(コンパイラ)の方が不可解な動きをしているのです。  sampleMethod(int, int)とsampleMethod(Object, Object)があるときは問題ないので、可変長引数のときだけambiguousになるようです。  「それなら」と思い、sampleMethod(int, int...)とsampleMethod(Object, Object...)を作ってみましたが、やはりエラーが出ます。  何か良い解決策はあるでしょうか?  可変長じゃない引数のオーバーロードを大量に作ることと、片方の可変長をやめること以外でアドバイスをお願いします。  もしくは、「個人的には~だから、パクリのc#よりjavaの方が動きが正しいぞ!」という方がいらっしゃいましたら、ご意見ください。