使用AsyncTask时如何获取插入对象的ID?

时间:2018-10-07 09:52:24

标签: java android android-asynctask repository

我必须创建一个帐户来问这个问题,因为我找不到正确的方法来执行此操作。唯一接近的是this question here,但它并没有完全消除,我仍然很困难。我们去...

我正在尝试遵循Architecture Components principles的大部分内容来构建应用程序。 我目前正在尝试在一个数据库表中添加一行,并获取该行的ID作为回报,然后在另一个表中插入行,并引用第一个表。

我已经创建了数据库对象:

@Entity(indices = {@Index("id")})
public class Search {

    @PrimaryKey(autoGenerate = true) private int id;
...

以及相应的DAO:

@Dao
public interface SearchDao {

    @Insert
    long insert(Search search);
...

如您所见,我的DAO返回带有创建的ID的long。这是我之前链接的问题中指出的行为,并记录在here中。

由于我遵循Android体系结构组件原则,因此我使用Repository类来完成我所有与数据库相关的工作。在此存储库中,我创建了一个公共方法来插入一个新对象,该对象正在创建并执行AsyncTask来完成工作:

public class Repository {
    public void insertSearch(Search search) {
        new insertSearchAsyncTask(this.mSearchDao).execute(search);
    }

...
    private static class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {

        private SearchDao mAsyncTaskDao;

        insertSearchAsyncTask(SearchDao dao) {
            this.mAsyncTaskDao = dao;
        }

        @Override
        protected Long doInBackground(final Search... params) {
            long id = this.mAsyncTaskDao.insert(params[0]);
            return id;
        }
}

我知道我可以使用onPostExecute(long id)方法对doInBackground方法的结果进行处理,但是此onPostExecute方法无法将任何内容返回给insertSearch方法,在此我创建了AsyncTask并执行了它。

我知道需要将我的insertSearch方法的返回类型更改为long。但是,如果我想返回一些东西,则需要获取AsyncTask执行的结果。 我该怎么做?

我尝试过this (according to the validated answer)

public class Repository {
    private long result_id = 0;
    public long insertSearch(Search search) {
        new insertSearchAsyncTask(this.mSearchDao).execute(search);
        return result_id;
    }

    private class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {

        private SearchDao mAsyncTaskDao;

        insertSearchAsyncTask(SearchDao dao) {
            this.mAsyncTaskDao = dao;
        }

        @Override
        protected Long doInBackground(final Search... params) {
            long id = this.mAsyncTaskDao.insert(params[0]);
            return id;
        }

        @Override
        protected void onPostExecute(Long search_id) {
            result_id = search_id;
        }

    }
}

但这感觉很非常错误。我必须使insertSearchAsyncTask类不是静态的,并且必须将insert的结果存储在我的属性中仓库。 我希望有一种更好/正确的方法。

我也在上面的链接中查看了其他建议的答案,尤其是关于Delegates的答案,但这不符合我的需要,因为我需要方法insertSearch返回结果,而不是AsyncTask在调用时返回的另一个方法完成。

我希望我已经清楚地解释了我的问题。 有人知道吗?

非常感谢!

0 个答案:

没有答案