Как сделать общий запрос AsyncTask для Android Room - PullRequest
1 голос
/ 03 апреля 2019

Поэтому я использую библиотеку Android Room для выполнения запросов к БД SQLite.

Я не могу делать запросы в потоке пользовательского интерфейса, поэтому я использую AsyncTask.

MyПриложение простое, я просто хочу иметь возможность вставлять новых пользователей в мою базу данных.

Итак, есть мой 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?

Заранее спасибо иизвините за мой английский;)

1 Ответ

0 голосов
/ 03 апреля 2019

Да, вы можете использовать его где угодно, сначала вы должны создать общий класс задач Async для всех методов. Вы можете создать интерфейс, передать его 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);
        }

    }
...