android - 如何避免在我的 Android Room 存储库中出现许多 AsyncTask 类?

标签 android android-studio kotlin android-room

我正在学习如何使用 Android Room,来自 google-developer-training ,我在其中找到了存储库类的示例。我尝试简化我的 SportRepository 类。我想知道如何避免代码中重复 inner class ...AsyncTask 。这是一个非常简单的示例:

@Singleton
class SportRepository {
    val LOG_TAG = SportRepository::class.java.name

    @Inject
    lateinit var sportDAO: SportDAO
    var list: LiveData<List<Sport>>

    init {
        App.app().appComponent()?.inject(this)
        list = sportDAO.getAll()
    }

    fun insert(sport: Sport) {
        insertAsyncTask().execute(sport)
    }

    fun update(sport: Sport){
        updateAsyncTask().execute(sport)
    }

    fun delete(sport: Sport) {
        deleteAsyncTask().execute(sport)
    }

    @SuppressLint("StaticFieldLeak")
    private inner class insertAsyncTask() : AsyncTask<Sport, Void, Void>() {
        override fun doInBackground(vararg p0: Sport): Void? {
            sportDAO.insert(p0.get(0))
            return null
        }
    }

    @SuppressLint("StaticFieldLeak")
    private inner class updateAsyncTask() : AsyncTask<Sport, Void, Void>() {
        override fun doInBackground(vararg p0: Sport): Void? {
            sportDAO.update(p0[0])
            return null
        }
    }

    @SuppressLint("StaticFieldLeak")
    private inner class deleteAsyncTask() : AsyncTask<Sport, Void, Void>() {
        override fun doInBackground(vararg p0: Sport): Void? {
            sportDAO.delete(p0[0])
            return null
        }
    }
}

AsyncTask 类与 sportDAO 类的区别仅在于名称和方法调用类型。

有什么方法可以避免创建许多几乎相同的 AsyncTask 类吗?

我还没有找到任何如何简化它的示例。

最佳答案

好吧,我也遇到过同样的情况。我使用了 3 种解决方案。 1. 使用接收。返回一个 Flowable,并在不同的线程上观察它。 2.使用LiveData。 3. 异步任务。这就是我通过使用泛型来避免多个异步任务的方法。我希望这就是您正在寻找的内容。

这是将执行您的查询的类。

/**
 *
 * @param <T> type of result expected
 */
public abstract class DaoAsyncProcessor<T> {

    public interface DaoProcessCallback<T>{
        void  onResult(T result);
    }

    private DaoProcessCallback daoProcessCallback;

    public DaoAsyncProcessor(DaoProcessCallback daoProcessCallback) {
        this.daoProcessCallback = daoProcessCallback;
    }

    protected abstract T doAsync();

    public void start(){
        new DaoProcessAsyncTask().execute();
    }

    private class DaoProcessAsyncTask extends AsyncTask<Void, Void, T>{

        @Override
        protected T doInBackground(Void... params) {
            return doAsync();
        }

        @Override
        protected void onPostExecute(T t) {
            if(daoProcessCallback != null)
                daoProcessCallback.onResult(t);
        }
    }
}

现在可以查询

fun putAllUsersAsync(vararg users: User) {
            object : DaoAsyncProcessor<Unit>(null) {
                override fun doAsync(): Unit {
                    yourDao.insertAll(*users)
                }

            }.start()
        }

另一个获取数据的示例。

fun getAllUsers(callback: DaoAsyncProcessor.DaoProcessCallback<List<User>>) {
            object : DaoAsyncProcessor<List<User>>(callback) {
                override fun doAsync(): List<User> {
                    return yourDao.getAll()
                }

            }.start()

您可以调用 getAllUsers 并传递回调来获取数据。

根据要求,这是 Kotlin 的等效项

abstract class DaoAsyncProcessor<T>(val daoProcessCallback: DaoProcessCallback<T>?) {

    interface DaoProcessCallback<T> {
        fun onResult(result: T)
    }


    protected abstract fun doAsync(): T

    fun start() {
        DaoProcessAsyncTask().execute()
    }

    private inner class DaoProcessAsyncTask : AsyncTask<Void, Void, T>() {

        override fun doInBackground(vararg params: Void): T {
            return doAsync()
        }

        override fun onPostExecute(t: T) {
            daoProcessCallback?.onResult(t)
        }
    }
}

关于android - 如何避免在我的 Android Room 存储库中出现许多 AsyncTask 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49520123/

相关文章:

android - 定制阵列适配器协助

java - Android Studio 自定义 ArrayAdapter 传递 HashMap 而不是 ArrayList

Kotlin 负模返回负值

kotlin - 在 Kotlin 中将元组或三元组作为参数传递

android - 原始 kapt 已弃用

java - 端点方法不起作用,为什么?

android - 无法解析 : com. android.support :support-v4:26. 3.1

java - 以编程方式接听电话

java - 设置布局的 Alpha/Opacity

android - Gradle 构建失败,出现错误 'timeout waiting to connect to the Grade daemon'