安卓 - AsyncTask类和Execute方法

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 是一个 long 类型,其包含在我的先前类中选择的联系人的 ID。这个先前的类是通过从数据库中获取所有联系人进行填充的 ListActivity。当我在这个类中接收到数据(通过意图)时,我想要恢复先前类中选择的单个联系人的数据,但在这种情况下,代码以这种方式出现: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 });               
            } /

帮助解答以下三个问题,谢谢。


在Java中,Long != long - Raghav Sood
2个回答

9

AsyncTask 的形式为 AsyncTask<Param, Progress, Return>,其中 execute 使用了 Param 类型。

#1

可以写成 execute(null)。这样做会在 IntelliJ IDEA 中产生 Confusing 'null' argument to var-arg method 警告。该警告指出,它没有作为单一元素数组包装。因此,在这种情况下,由于 ParamObject,所以使用 execute((Object[])null) 来抑制警告。

由于可变参数不必传递值,因此可以使用 execute() 代替。

#2 & #3

在这种情况下,ParamLong,因此执行方法的形式为 execute(Long...)。没有可变参数语法糖时,这与 execute(Long[]) 相同。因此,new Long[]{ rowId } 明确地创建了具有单个元素(rowId)的 Long 数组。由于 rowId 是一个 long,Java 编译器会自动将该整数“装箱”(封装)为一个 Long 对象,相当于写成 new Long(rowId)

由于 execute 方法使用可变参数,因此您不需要直接分配 Long 数组 - Java 编译器会为您执行此操作 - 因此,您只需编写 execute(rowId)。也就是说,Java 编译器将 execute(rowId) 扩展为 execute(new Long[]{ new Long(rowId) })

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


3
你所有问题的答案都是一个AsyncTask逻辑:
在定义AsyncTask时,我们需要声明3个参数: private class MyTask extends AsyncTask<Object,Object,Cursor> 就像你上面的例子一样,你已经给出了Object,Object,Cursor。
现在,第一个参数在“execute”调用期间设置,并由doInBackground()函数使用。这被设计为定义类型的数组,以便我们可以发送多个数据。例如,我们可以执行: myTask.execute(url1,url2,url3),对于我的AsysncTask,其第一个参数是URL。在doInBackground()函数中,我们可以将它们作为url[0],url[1],url[2]来访问。 AsyncTask中的第二个参数由onProgressUpdate()函数使用,它还希望接收定义类型的数组。

AsyncTask中的第三个参数由onPostExecute()函数使用,是doInBackground()函数返回的值。它不需要是一个定义类型的数组。

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

private class MyTask extends AsyncTask { ... }

以下链接详细介绍了AsyncTask,将回答您的所有3个问题:

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


@NightSky.. 我希望现在看起来正常。感谢您指出问题。我还在学习如何格式化内容 :) - Sushil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接