Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为Android房间请求创建通用异步任务_Java_Android_Sqlite_Android Asynctask_Android Room - Fatal编程技术网

Java 如何为Android房间请求创建通用异步任务

Java 如何为Android房间请求创建通用异步任务,java,android,sqlite,android-asynctask,android-room,Java,Android,Sqlite,Android Asynctask,Android Room,所以我使用Android Room库在SQLite数据库上执行请求 我无法在UI线程上发出请求,因此我使用AsyncTask 我的应用程序很简单,我只是希望能够将新用户插入我的数据库 下面是我的UserDao.java: @Dao public interface UserDao { @Insert long insert(User user); @Update void update(User user); @Delete void dele

所以我使用Android Room库在SQLite数据库上执行请求

我无法在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
        }
那么,有可能使我的AsyncTask类更通用吗? 我希望能够将该类用于多个请求(如插入、更新、删除…)

或者我应该改为使用通用DAO吗


提前谢谢,对不起我的英语;)

是的,您可以在任何地方使用它。首先,您必须为所有方法创建通用异步任务类 您可以创建一个接口,将其传递给AsyncTask(在构造函数中),然后在onPostExecute()中调用方法

1.您的界面:

    public interface OnTaskRoomCompleted{
        void onTaskCompleted(User);
    }
2.你的活动:

    public class YourActivity implements OnTaskRoomCompleted{
        // your Activity
    }
3.你的任务是:

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);
        }

    }
public类YourTask扩展了AsyncTask{//将对象更改为所需类型
私有ontaskroom监听器;
公共YourRoomTask(OnTaskCompleted侦听器){
this.listener=listener;
}
//必要的方法
受保护的void onPostExecute(对象用户){
//你的东西
listener.onTaskRoomCompleted(用户);
}
}
@覆盖 已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){ super.onViewCreated(视图,savedInstanceState)

UserId=view.findviewbyd(R.id.user\u id);
用户名=view.findviewbyd(R.id.user\u name\u id);
UserEmail=view.findviewbyd(R.id.user\u email\u id);
save=view.findviewbyd(R.id.bn\u save);
save.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
String id=UserId.getText().toString();
字符串名称=UserName.getText().toString();
字符串email=UserEmail.getText().toString();
字符串userData[]={id,name,email};
GetUsersAsyncTask=新建GetUsersAsyncTask();
试一试{
字符串状态=task.execute(userData.get();
Toast.makeText(getContext(),status,Toast.LENGTH_SHORT).show();
}捕获(ExecutionException | InterruptedException e){
e、 printStackTrace();
}
//在UI中编辑添加用户的字段
UserId.setText(“”);
UserName.setText(“”);
UserEmail.setText(“”);
}
});
}
私有静态类GetUsersAsyncTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串[]…字符串){
String[]userDatas=strings[0];
int id=Integer.parseInt(userDatas[0]);
字符串名称=userDatas[1];
字符串email=userDatas[2];
用户=新用户();
user.setId(id);
user.setName(name);
user.setEmail(email);
MainActivity.myAppDatabase.myDao().addUser(用户);
返回“数据插入成功…”;
}
}

您也可以在后台任务中使用thread和runnable。“所以我正在使用AsyncTask”--我建议使用更现代的工具:
LiveData
、Kotlin协同程序或RxJava。是的,我看了LiveData和RxJava,但是我不明白他们如何帮助我创建一个可以处理不同请求的异步任务。谢谢你的回答,但我真的不明白这个方法是什么:
javavoidontaskcompleted(User)我也不明白这怎么会使“YourTask”更通用:/因为我仍然需要一个“doInBackground()”函数来执行我的请求。
    public class YourActivity implements OnTaskRoomCompleted{
        // your Activity
    }
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);
        }

    }
    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....";
    }
}