【问题标题】:How to make generic AsyncTask for Android Room request如何为 Android Room 请求制作通用 AsyncTask
【发布时间】: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 吗?

在此先感谢,对不起我的英语;)

【问题讨论】:

  • 您也可以将 threadrunnable 用于后台任务。
  • “所以我使用的是 AsyncTask”——我建议使用更现代的东西:LiveData、Kotlin 协程或 RxJava。
  • 是的,我查看了 LiveData 和 RxJava,但我不明白它们如何帮助我创建可以处理不同请求的单个异步任务。

标签: java android sqlite android-asynctask android-room


【解决方案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....";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    相关资源
    最近更新 更多