android - 在 AsyncTask 中将对象作为参数传递
问题描述
我想使用AsyncTask
. 现在我可以选择为每种类型的查询创建不同的 AsyncTasks。我倾向于的另一种选择是为每种类型的查询创建一个 AsyncTask。
如果我将参数作为对象传递然后再将它们转换回来,这是一种不好的做法吗?我会遇到一些麻烦吗?我应该在构造函数中传递所有内容吗?
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;
}
}
解决方案
如果我将参数作为对象传递,然后将它们转换回来,这是一种不好的做法吗?我能遇到一些麻烦吗?我应该在构造函数中传递所有内容吗?
是的,这是一个非常糟糕的做法。考虑您的以下代码:
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 制作每个单独的任务,并通过构造函数传递值(引用)。例如,您可以为 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 Interface。像这样的东西:
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();
这比以前的代码更具可读性。
注意:所有代码尚未测试。
推荐阅读
- python - scrapy如何获得div类的第二个?
- reactjs - 如何根据其属性 id 从数组中获取特定项目/对象的详细信息 - React
- javascript - javascript中没有双引号的字符串数组
- javascript - 如何在一定条件下将数组划分为 3 个对象
- tensorflow - TensforFlow 模型的输入数据错误
- android - java.lang.IllegalStateException:后端内部错误:代码生成期间出现异常
- javascript - res.redirect() 输出到浏览器“找到。重定向到
" - java - Java 8:如何从列表中创建映射,其中键是从相同的类(empID)和值作为对象(雇员)本身获取的?
- php - 当用户从站点 A 导航到站点 B 时,我们如何将 woocommerce 购物车详细信息从一个站点发送到另一个站点
- reactjs - 如何将 HTML 输入绑定到 React 中的函数?