我有使用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)
帮助解决这三个问题并表示感谢.
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
在这种情况下,Param是Long,所以execute方法具有表单execute(Long...).没有变量参数语法糖,这是相同的execute(Long[]).因此,new Long[]{ rowId }显式创建Long具有单个元素(rowId)的数组.由于rowId是long,Java编译器自动"方框"(包裹),该整数为Long对象-写入的等效new Long(rowId).
由于该execute方法使用可变参数,因此您无需Long直接分配数组 - Java编译器将为您执行此操作 - 因此您只需编写代码即可execute(rowId).也就是说,Java编译器正在扩大execute(rowId)到execute(new Long[]{ new Long(rowId) }).
因此,#2和#3是等价的.
| 归档时间: |
|
| 查看次数: |
19507 次 |
| 最近记录: |