如何为 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 吗?

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

【问题讨论】:

您也可以将 threadrunnable 用于后台任务。 “所以我使用的是 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的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个请求制作一个 beanscript 函数

如何为通用 HTTP 请求的响应文件指定唯一名称?

如何为现有的非 android Eclipse 项目制作 android manifest?

如何为现有的动态网站制作android应用

如何为 android 制作更长的 facebook Graph API 会话

如何为android应用程序制作worklight服务器