如何为 Android Room 请求制作通用 AsyncTask
Posted
技术标签:
【中文标题】如何为 Android Room 请求制作通用 AsyncTask【英文标题】:How to make generic AsyncTask for Android Room request 【发布时间】:2019-08-24 19:36:58 【问题描述】:所以我使用 android Room 库在 SQLite DB 上执行请求。
我无法在 UI 线程上发出请求,所以我正在使用 AsyncTask。
我的应用很简单,我只是希望能够将新用户插入到我的数据库中。
所以有我的 UserDao.java :
@Dao
public interface UserDao
@Insert
long insert(User user);
@Update
void update(User user);
@Delete
void delete(User user);
还有我的 User.java :
@Entity
public class User
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int age;
// Getter / Setter
然后,为了执行我的插入请求,我必须创建一个完整的 AsyncTask 类:
public static class insertAsyncTask extends AsyncTask<User, Void, User>
private WeakReference<Activity> weakActivity;
private UserDao dao;
// Constructeur
insertAsyncTask(Activity activity, UserDao dao)
this.weakActivity = new WeakReference<>(activity);
this.dao = dao;
@Override
protected User doInBackground(final User... params)
return this.dao.getById(this.dao.insert(params[0]));
@Override
protected void onPostExecute(User u)
// Some code
最后,我这样称呼插入:
new AppDatabase.insertAsyncTask(this, db.userDao()).execute(myUser);
那么是否可以让我的 AsyncTask 类更通用? 我希望能够将此类用于多个请求(如插入、更新、删除......)。
或者我应该改用通用 DAO 吗?
在此先感谢,对不起我的英语;)
【问题讨论】:
您也可以将 thread 和 runnable 用于后台任务。 “所以我使用的是 AsyncTask”——我建议使用更现代的东西:LiveData
、Kotlin 协程或 RxJava。
是的,我查看了 LiveData 和 RxJava,但我不明白它们如何帮助我创建可以处理不同请求的单个异步任务。
【参考方案1】:
是的,你可以在任何地方使用它,首先你必须为所有方法创建通用异步任务类 您可以创建一个接口,将其传递给 AsyncTask(在构造函数中),然后在 onPostExecute() 中调用方法
For example:
1.你的界面:
public interface OnTaskRoomCompleted
void onTaskCompleted(User);
2.您的活动:
public class YourActivity implements OnTaskRoomCompleted
// your Activity
3.还有你的 AsyncTask:
public class YourTask extends AsyncTask<User,Object,User> //change Object to required type
private OnTaskRoomCompleted listener;
public YourRoomTask(OnTaskCompleted listener)
this.listener=listener;
// required methods
protected void onPostExecute(Object user)
// your stuff
listener.onTaskRoomCompleted(user);
【讨论】:
谢谢你的回答,但我真的不明白这个方法是什么:Java void onTaskCompleted(User);
我也无法理解这如何使“YourTask”更通用:/
因为我仍然需要一个“doInBackground()”函数来执行我的请求。【参考方案2】:
@覆盖 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) super.onViewCreated(view, savedInstanceState);
UserId = view.findViewById(R.id.user_id);
UserName= view.findViewById(R.id.user_name_id);
UserEmail=view.findViewById(R.id.user_email_id);
save = view.findViewById(R.id.bn_save);
save.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
String id = UserId.getText().toString();
String name = UserName.getText().toString();
String email =UserEmail.getText().toString();
String userData[] =id,name,email;
GetUsersAsyncTask task = new GetUsersAsyncTask();
try
String status = task.execute(userData).get();
Toast.makeText(getContext(),status , Toast.LENGTH_SHORT).show();
catch (ExecutionException | InterruptedException e)
e.printStackTrace();
//emty the fields of the add user in the UI
UserId.setText("");
UserName.setText("");
UserEmail.setText("");
);
private static class GetUsersAsyncTask extends AsyncTask<String[], Void,String>
@Override
protected String doInBackground(String[]... strings)
String[] userDatas = strings[0];
int id = Integer.parseInt(userDatas[0]);
String name = userDatas[1];
String email =userDatas[2];
User user = new User();
user.setId(id);
user.setName(name);
user.setEmail(email);
MainActivity.myAppDatabase.myDao().addUser(user);
return "Data Inserted SuccessFully....";
【讨论】:
以上是关于如何为 Android Room 请求制作通用 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章
如何为现有的非 android Eclipse 项目制作 android manifest?