【问题标题】:Get int value from method, which executes on background thread从方法中获取 int 值,该方法在后台线程上执行
【发布时间】:2018-04-17 05:19:09
【问题描述】:

我正在使用 Google 架构组件,尤其是 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

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    在您的 DAO 中,获取照片计数的函数既不使用 LiveData 也不使用 RX。因此,您基本上可以使用任何 Android 异步技术,例如 AsyncTask,而不是将代码随后包装在 Completable 中。

    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 链。这在本示例中未实现。

    【讨论】:

    • 当然,我在我的项目中也使用了 rx,但我决定从头开始学习线程。
    • 我包装int是否正常,我需要返回一个1元素数组?
    • 在您的方法中,您在 IO 调度程序上执行 Completable,但您在主线程上等待结果,在结果到达之前它仍然被阻塞。基本上你可以直接调用你的 getPersistedPhotosSize 函数(但 Room 会抱怨),它具有相同的效果。关于 1-array 方法:我只在 UnitTests 中使用它,在那里我也使用阻塞 observables。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多