从方法获取int值,该方法在后台线程上执行

时间:2018-04-17 05:19:10

标签: java android android-room

我使用的是Google Architecture Components,尤其是Room。

在我的道中,我有这种方法:

@Query("SELECT COUNT(*) FROM photos")
int getPersistedPhotosSize();

我需要在我的存储库中执行它以检查持久的照片大小是否为0.

所以我必须在后台执行此方法并从中获取值。

现在我执行此操作:

   public int getNumRowsFromFeed() {
   final int[] rows = new int[1];
   Completable.fromAction(() -> rows[0] = photosDao.getPersistedPhotosSize())
           .subscribeOn(Schedulers.io())
           .blockingAwait();
   return rows[0];
}

但我认为是最好的方法。

那么我怎样才能以正确的方式获得价值呢?特别是我想要没有 RX

1 个答案:

答案 0 :(得分:3)

在您的DAO中,获取照片计数的功能不会使用LiveDataRX。因此,您不必在Completable中包装代码,而是基本上可以使用任何Android异步技术,例如AsyncTask

public class LoadTask extends AsyncTask<Void, Void, Integer> {

    public interface Callback {
        void onPhotoCount(int count);
    }

    private final Callback callback;

    public LoadTask(Callback callback) {
         this.callback = callback;
    }

    protected Integer doInBackground(Void... params) {
        return photosDao.getPersistedPhotosSize();
    }

    protected void onPostExecute(Integer result) {
         callback.onPhotoCount(result);
    }

}

...

new LoadTask(photoCount -> {
    // Do stuff with value,e.g. update ui.
}).execute();

这基本上只是一个提案,当然你也可以使用Threads,Handler。

P.S:从我的观点来看,这个例子展示了Rx开发的一个优点。您可以免费获得回调内容,而无需定义任何内容。您可以取消Rx链,例如由于生命周期事件。在此示例中未实现此操作。