Android - AsyncTask类和Execute方法

use*_*401 3 android

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

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

       new MyTask().execute((Object[]) null);
    } // end method onResume
Run Code Online (Sandbox Code Playgroud)

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();
      } 
   } 
Run Code Online (Sandbox Code Playgroud)

另一个AsyncTask问题:

delete.execute(new Long[] { rowID });
Run Code Online (Sandbox Code Playgroud)

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 });               
            } /
Run Code Online (Sandbox Code Playgroud)

帮助解决这三个问题并表示感谢.

ree*_*ece 9

AsyncTask具有如下形式:AsyncTask<Param, Progress, Return>execute使用Param类型.

#1

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

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

#2

在这种情况下,ParamLong,所以execute方法具有表单execute(Long...).没有变量参数语法糖,这是相同的execute(Long[]).因此,new Long[]{ rowId }显式创建Long具有单个元素(rowId)的数组.由于rowIdlong,Java编译器自动"方框"(包裹),该整数为Long对象-写入的等效new Long(rowId).

由于该execute方法使用可变参数,因此您无需Long直接分配数组 - Java编译器将为您执行此操作 - 因此您只需编写代码即可execute(rowId).也就是说,Java编译器正在扩大execute(rowId)execute(new Long[]{ new Long(rowId) }).

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