Android - AsyncTask类和Execute方法

时间:2013-08-18 23:46:17

标签: android

我有使用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是一个long类型,它包含我在上一课中选择的联系人的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 });               
            } /

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

2 个答案:

答案 0 :(得分:9)

AsyncTask的格式为AsyncTask<Param, Progress, Return>execute使用Param类型。

#1

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

由于变量参数参数不必传递给它们,因此您可以使用execute()代替。

#2&amp; #3

在这种情况下,ParamLong,因此执行方法的格式为execute(Long...)。没有变量参数语法糖,这与execute(Long[])相同。因此,new Long[]{ rowId }使用单个元素(Long)显式创建rowId数组。由于rowIdlong,Java编译器会自动将该整数“包装”(包装)到Long对象中 - 相当于编写new Long(rowId)

由于execute方法使用变量参数,因此您无需直接分配Long数组 - Java编译器将为您执行此操作 - 因此您只需编写{{1相反。也就是说,Java编译器正在将execute(rowId)扩展为execute(rowId)

因此,#2和#3是等价的。

答案 1 :(得分:3)

您所有问题的答案都是AsyncTask逻辑:

在定义AsyncTask时,我们需要声明3个参数:

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

与上面的情况一样,你已经给出了Object,Object,Cursor。

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

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

AsyncTask中的第二个参数由onProgressUpdate()函数使用,它还希望接收已定义类型的数组。

<{1>} AsyncTask中的第3个参数由onPostExecute()函数使用,并且是doInBackGround()函数重新转换的值。不需要是定义类型的数组。

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

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

以下关于AsyncTask的链接详情将回答您的所有3个问题:

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