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

Java 从方法中获取int值,该方法在后台线程上执行,java,android,android-room,Java,Android,Android Room,我正在使用Google架构组件,尤其是Room 在我的Dao中,我有以下方法: @Query("SELECT COUNT(*) FROM photos") int getPersistedPhotosSize(); 我需要在我的存储库中执行它,以检查持久化照片的大小是否为0 所以我必须在后台执行这个方法,并从中获取值 现在我执行以下操作: public int getNumRowsFromFeed() { final int[] rows = new int[1]; Comp

我正在使用Google架构组件,尤其是Room

在我的Dao中,我有以下方法:

@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];
}
但我想这不是最好的方法


那么,我怎样才能以正确的方式获得值呢?特别是我想在DAO中不使用RX

的情况下执行该操作。获取照片计数的函数既不使用
LiveData
也不使用
RX
。因此,您基本上可以使用任何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();
公共类LoadTask扩展了AsyncTask{
公共接口回调{
无效光计数(整数计数);
}
私有最终回调;
公共加载任务(回调){
this.callback=回调;
}
受保护的整数doInBackground(Void…params){
返回photosDao.getPersistedPhotosSize();
}
受保护的void onPostExecute(整数结果){
回调.onPhotoCount(结果);
}
}
...
新加载任务(光电计数->{
//做有价值的事情,例如更新用户界面。
}).execute();
这基本上只是一个建议,当然您也可以使用线程和处理程序


附言:在我看来,这个例子展示了
Rx
开发的一个优势。您可以免费获得回调内容,而无需定义任何内容。例如,由于生命周期事件,您可以取消接收链。这在本例中没有实现

当然,我在我的项目中也使用了rx,但我决定从头开始学习线程。我包装int是正常的吗?我需要在1元素数组中返回int?在您的方法中,您在IO调度程序上执行
Completable
,但您在主线程上等待结果,在结果到达之前,它仍然被阻塞。基本上你可以直接调用你的
getPersistedPhotosSize
函数(但是房间会抱怨),它也有同样的效果。关于1-array方法:我只在单元测试中使用它,在单元测试中,我还使用阻塞观察值。