我有使用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 });
} /
帮助解决这三个问题,谢谢。
答案 0 :(得分:9)
AsyncTask
的格式为AsyncTask<Param, Progress, Return>
,execute
使用Param
类型。
#1
可以写execute(null)
。这样做会导致IntelliJ IDEA中出现Confusing 'null' argument to var-arg method
警告。此警告指出它未包装为单元素数组。因此,在这种情况下Param
为Object
,execute((Object[])null)
用于抑制警告。
由于变量参数参数不必传递给它们,因此您可以使用execute()
代替。
#2&amp; #3
在这种情况下,Param
为Long
,因此执行方法的格式为execute(Long...)
。没有变量参数语法糖,这与execute(Long[])
相同。因此,new Long[]{ rowId }
使用单个元素(Long
)显式创建rowId
数组。由于rowId
是long
,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()
函数使用,它还希望接收已定义类型的数组。
AsyncTask
中的第3个参数由onPostExecute()
函数使用,并且是doInBackGround()
函数重新转换的值。不需要是定义类型的数组。
并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型Void:
私有类MyTask扩展了AsyncTask {...}
以下关于AsyncTask
的链接详情将回答您的所有3个问题:
http://developer.android.com/reference/android/os/AsyncTask.html