3

データベースからいくつかの連絡先を listView に入力するために AsyncTask クラスを使用するコードがあります。

@Override
   protected void onResume() 
   {
      super.onResume();

       new MyTask().execute((Object[]) null);
    } // end method onResume

1.- なぜこれを渡す(Object[]) null)のですか: 引数として?

AsyncTask コードを参照してください。

private class MyTask extends AsyncTask<Object, Object, Cursor> 
   {
      //used for database conection purpose 
      ConectToDatabase databaseConnector = 
         new ConectToDatabase(ThisClass.this);


      @Override
      protected Cursor doInBackground(Object... params)
      {
         databaseConnector.open();

         return databaseConnector.getMyContacts(); 
      } 

      // use the Cursor returned from the doInBackground method
      @Override
      protected void onPostExecute(Cursor result)
      {
         //My cursorAdadper defined in early code
         contactAdapter.changeCursor(result);
         databaseConnector.close();
      } 
   } 

別の AsyncTask の問題:

delete.execute(new Long[] { rowID });

2.- なぜこれを渡すのですか:(new Long[] { rowID })単純な (rowId) ではなく、引数として渡すのですか?

rowID は、前のクラスで選択した連絡先の ID を含む long 型です。それは ListActivity での拡張でした。この前のクラスには、データベースで取得したすべての連絡先が入力されていました。このクラスで (インテントによって) データが送信された場合、前のクラスで選択した単一の連絡先のデータを回復したいのですが、この場合、コードは次のように表示されます: new LoadMyContact().execute(rowID);onResume メソッドにあります。

(rowID)3.-引数として: のみを渡すのはなぜですか?

delete.execute(new Long[] { rowID });メニュー内にあります。ユーザーが連絡先の削除を確認すると、その文を実行します。削除のコードは次のようになります (クリック ボタンの内側にあります)。

@Override
            public void onClick(DialogInterface dialog, int button)
            {
               final ConectToDataBase databaseConnector = 
                  new ConectToDataBase(MySecondClass.this);


               AsyncTask<Long, Object, Object> deleteTask =
                  new AsyncTask<Long, Object, Object>()
                  {
                     @Override
                     protected Object doInBackground(Long... params)
                     {
                        databaseConnector.deleteContact(params[0]); 
                        return null;
                     } 

                     @Override
                     protected void onPostExecute(Object result)
                     {
                        finish(); 
                        delete.execute(new Long[] { rowID });              
                      }
                  }; // end new AsyncTask
               delete.execute(new Long[] { rowID });               
            } /

この 3 つの質問と感謝を手伝ってください。

4

2 に答える 2

9

AsyncTaskAsyncTask<Param, Progress, Return>型をexecute使った形をしていParamます。

#1

と書くことが可能execute(null)です。これを行うとConfusing 'null' argument to var-arg method、IntelliJ IDEA で警告が表示されます。この警告は、単一要素の配列としてラップされていないことを示しています。したがって、この場合のようにParam、警告を抑制するために使用されます。Objectexecute((Object[])null)

可変引数パラメーターには値を渡す必要がないため、execute()代わりに使用できます。

#2 & #3

この場合、ParamLongであるため、execute メソッドの形式はexecute(Long...)です。可変引数のシンタックス シュガーがなければ、これは と同じexecute(Long[])です。したがって、 は、1 つの要素 ( ) を持つ配列をnew Long[]{ rowId }明示的に作成しています。と同様に、Java コンパイラはその整数をオブジェクトに自動的に「ボックス化」(ラップ) します。LongrowIdrowIdlongLongnew Long(rowId)

メソッドは可変引数を使用するためexecute、配列を直接割り当てる必要はありません。Java コンパイラがこれを行います。そのため、代わりLongに記述するだけで済みます。execute(rowId)つまり、Java コンパイラは に拡張execute(rowId)されてexecute(new Long[]{ new Long(rowId) })います。

したがって、#2 と #3 は同等です。

于 2013-08-19T00:31:20.697 に答える
3

すべての質問に対する答えはAsyncTask論理です。

を定義する際AsyncTaskに、3 つのパラメーターを宣言する必要があります。

private class MyTask extends AsyncTask<Object, Object, Cursor>

上記の場合と同様に、Object、Object、Cursor を指定しました。

これで、最初のパラメーターは「実行」呼び出し中に設定され、doInBackGround()関数によって使用されます。これは、複数のデータを送信できるように、定義済みの型の配列になるように設計されています。たとえば、次のことができます。

myTask.execute(url1, url2, url3)AsysncTaskの場合、最初のパラメーターは URL です。doInBackGround()関数では、url[0]、url[1]、url[2] として評価できます。

の 2 番目のパラメーターAsyncTaskは関数によって使用されonProgressUpdate()、定義された型の配列を受け取ることも想定しています。

3 番目のパラメータ inAsyncTaskは関数によって使用され、onPostExecute()関数によって返される値ですdoInBackGround()。定義された型の配列である必要はありません。

すべての型が常に非同期タスクで使用されるわけではありません。タイプを未使用としてマークするには、単にタイプ Void を使用します。

プライベート クラス MyTask は AsyncTask を拡張します { ... }

以下のリンクの詳細はAsyncTask、あなたの3つの質問すべてに答えます:

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-08-19T00:28:19.757 に答える