在AsyncTask中将对象作为参数传递



我想使用AsyncTask查询数据库。现在,我可以选择为每种类型的查询创建不同的AsyncTasks。我倾向于的另一种选择是为每种类型的查询创建一个AsyncTask。

如果我将params作为对象传递,然后再将其投射回去,这是一种糟糕的做法吗?我会遇到麻烦吗?我应该在构造函数中传递所有内容吗?

public void insert (Item item){
new queryAsyncTask(mItemDao).execute(INSERT_QUERY, item);
}
public void delete (int uid){
new queryAsyncTask(mItemDao).execute(DELETE_QUERY, uid);
}
private static class queryAsyncTask extends AsyncTask<Object, Void, Void>{
private ItemDao mAsyncDao;
queryAsyncTask(ItemDao dao){
mAsyncDao = dao;
}
@Override
protected Void doInBackground(Object... objects) {
switch ((int) objects[0]){
case DELETE_QUERY:
mAsyncDao.deleteItem((int)objects[1]);
break;
case INSERT_QUERY:
mAsyncDao.insert((Item)objects[1]);
break;
}
return null;
}
}

如果我将params作为对象传递,然后将其强制返回,这是不好的做法?我会遇到麻烦吗?我应该路过吗构造函数中的所有内容?

是的,这是一种非常糟糕的做法。考虑您的以下代码:

private static class queryAsyncTask extends AsyncTask<Object, Void, Void>{
private ItemDao mAsyncDao;
queryAsyncTask(ItemDao dao){
mAsyncDao = dao;
}
@Override
protected Void doInBackground(Object... objects) {
...
}
}

然后你可以用来称呼它

new queryAsyncTask(mItemDao).execute(DELETE_QUERY, uid);

new queryAsyncTask(mItemDao).execute(INSERT_QUERY, item);

但是,你也可以用以下两种方法来称呼它:

new queryAsyncTask(mItemDao).execute(new Object(), item);
new queryAsyncTask(mItemDao).execute(new ArrayList<String>(), item);

它没有给出任何错误。这是因为你的代码没有严格的限制,也没有对它的作用给出足够的解释。


您最好为CRUD制作每个Task,并通过构造函数传递值(引用)。例如,您可以为INSERT创建这样的东西:

private static class InsertQueryTask extends AsyncTask<Void, Void, Void> {
private ItemDao mItemDao;
private Item mItem;
InsertQueryTask(ItemDao dao, Item item) {
mItemDao = dao;
mItem = item;
}
@Override
protected Void doInBackground(Void... voids) {
mItemDao.insert(mItem);
}
}

那么你可以称之为:

new InsertQueryTask(mItemDao, item).execute();

上面的代码行更具可读性和可维护性,因为您只能通过读取代码的名称来判断代码在做什么。

您可以进一步修改代码,使其成为Fluent接口。类似这样的东西:

private static class InsertQueryTask extends AsyncTask<Void, Void, Void> {
private ItemDao mItemDao;
private Item mItem;
InsertQueryTask(ItemDao dao) {
mItemDao = dao;
}
InsertQueryTask with(Item item) {
mItem = item;
return this;
}
@Override
protected Void doInBackground(Void... voids) {
mItemDao.insert(mItem);
}
}

现在,你可以用来称呼它

new InsertQueryTask(mItemDao).with(item).execute();

其比先前的代码更可读。

注意:所有代码尚未测试。

最新更新