3

我有使用 AsyncTask 类的代码,用于使用数据库中的多个联系人填充 listView。

@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。那是 ListActivity 中的extendend。以前的课程由我在数据库中获得的所有联系人填充。当我在这个类中(通过意图)发送数据时,我想恢复在我之前的类中选择的单个联系人的数据,但在这种情况下,代码以这种方式出现:new LoadMyContact().execute(rowID);位于 onResume 方法中。

3.- 为什么我只传递:(rowID)作为参数?

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 });               
            } /

帮助解决这三个问题,谢谢。

4

2 回答 2

9

AsyncTask具有AsyncTask<Param, Progress, Return>使用类型execute的形式Param

#1

可以写execute(null)。这样做会导致Confusing 'null' argument to var-arg methodIntelliJ IDEA 中出现警告。此警告指出,它没有包装为单元素数组。因此,ParamObject这种情况下,execute((Object[])null)用于抑制警告。

由于可变参数参数不必将值传递给它们,因此您可以execute()改用。

#2 & #3

在这种情况下,Paramis Long,所以 execute 方法的形式是execute(Long...)。如果没有变量参数语法糖,这与execute(Long[]). 因此,这new Long[]{ rowId }是显式创建Long具有单个元素 ( rowId) 的数组。同样rowIdlongJava 编译器会自动将该整数“装箱”(包装)到一个Long对象中——相当于编写new Long(rowId).

由于该execute方法使用可变参数,因此您不需要Long直接分配数组——Java 编译器会为您完成这项工作——因此您可以直接编写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>

就像你上面的例子一样,你已经给出了对象、对象、光标。

现在,第一个参数在“执行”调用期间设置并由doInBackGround()函数使用。这被设计为定义类型的数组,以便我们可以发送多个数据。例如,我们可以这样做:

myTask.execute(url1, url2, url3)对于我AsysncTask的第一个参数是 URL。在doInBackGround()函数中,我们可以评估为 url[0], url[1], url[2]

第二个参数 inAsyncTaskonProgressUpdate()函数使用,它还期望接收定义类型的数组。

第三个参数 inAsyncTaskonPostExecute()函数使用,是函数返回的值doInBackGround()。In 不需要是定义类型的数组。

并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型 Void:

私有类 MyTask 扩展 AsyncTask { ... }

以下链接详细信息AsyncTask将回答您的所有 3 个问题:

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

于 2013-08-19T00:28:19.757 回答