Issue
So I'm using Android Room library to perform requests on a SQLite DB.
I can't make requests on the UI thread, so I'm using AsyncTask.
My app is simple, I juste want to be able to insert new Users into my database.
So there is my UserDao.java :
@Dao
public interface UserDao {
@Insert
long insert(User user);
@Update
void update(User user);
@Delete
void delete(User user);
}
And there is my User.java :
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int age;
// Getter / Setter
}
And then, to perform my Insert request, I have to make an entire AsyncTask class :
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
}
And finally, I'm calling the Insert like that :
new AppDatabase.insertAsyncTask(this, db.userDao()).execute(myUser);
So is it possible to make my AsyncTask class more generic ? I would like to be able to use this class for multiple requests (like Insert, Update, Delete ...).
Or should I do a generic DAO instead ?
Thanks in advance and sorry for my English ;)
Solution
Yes you can use it anywhere first you have to make generic Async task class for all methods You can create an interface, pass it to AsyncTask (in constructor), and then call method in onPostExecute()
For example:
1.Your interface:
public interface OnTaskRoomCompleted{
void onTaskCompleted(User);
}
2.Your Activity:
public class YourActivity implements OnTaskRoomCompleted{
// your Activity
}
3.And your 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);
}
}
Answered By - Chanaka Weerasinghe
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.