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

Zig*_*igo 5 java android repository android-asynctask

我必须创建一个帐户才能提出这个问题,因为我找不到正确的方法。唯一接近的是这里的问题,但它并没有完全解决,我仍然陷入困境。开始了...

我正在尝试构建一个遵循尽可能多的架构组件原则的应用程序。我目前正在尝试在一个数据库表中添加一行,并获取该行的 ID 作为返回,然后在另一个表中插入一行,并引用第一个表。

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

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

    @PrimaryKey(autoGenerate = true) private int id;
...
Run Code Online (Sandbox Code Playgroud)

以及对应的DAO:

@Dao
public interface SearchDao {

    @Insert
    long insert(Search search);
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的 DAO 返回一个带有创建的 ID 的长整型值。这是我之前链接的问题中指出的行为,并记录在此处

由于我遵循 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;
        }
}
Run Code Online (Sandbox Code Playgroud)

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

我知道需要将 insertSearch 方法的返回类型更改为 long。但是,如果我想要返回一些内容,我需要获取 AsyncTask 的执行结果。我怎样才能做到这一点?

我已经尝试过(根据经过验证的答案)

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

    }
}
Run Code Online (Sandbox Code Playgroud)

但这感觉非常非常错误。我必须使 insertSearchAsyncTask 类成为非静态的,并且必须将插入结果存储在我的存储库的属性中。我希望有更好/正确的方法来做到这一点。

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

我希望我已经足够清楚地解释了我的问题。有人有什么想法吗?

多谢!!