来自 DAO 方法的 return 值的空指针异常

Nullpointer Exception on return value from a DAO method

我使用的是 Room 数据库,我希望在输入对象名称时从数据库中搜索并获取单个对象。为此,我在 DAO 中编写了这个查询:

 @Query("SELECT * FROM kuh_table WHERE name = :kuhName ")
    Kuh findKuh(String kuhName);

我在存储库中这样调用它:

public Kuh findKuh(String kuhName){
        final Kuh[] kuh = new Kuh[1];
        new Thread(new Runnable() {
            volatile boolean running = true;
            @Override
            public void run() {
                if(running!= true) {
                    return;
                }
                kuh[0] =kuhDAO.findKuh(kuhName);
                running = false;
            }
        }).start();
        return kuh[0];
    }

然后在我的 ViewModel 中这样:

public Kuh findKuh(String kuhName){ return repository.findKuh(kuhName);}

然后我在一个片段中初始化我的 ViewModel 并尝试通过给出这样的字符串来使用该方法:

MarkerApiKt.setMarkerTapListener(mapView, (MarkerTapListener) (new MarkerTapListener() {
                public void onMarkerTap(@NotNull View view, int x, int y) {
                    Intrinsics.checkNotNullParameter(view, "view");
                    if (view instanceof MapMarker) {
                        MarkerCallout callout = new MarkerCallout(context);
                        callout.setTitle(((MapMarker) view).getName());
                        callout.setSubTitle("position: " + ((MapMarker) view).getX() + " , " + ((MapMarker) view).getY());
                        Kuh kuh = kuhViewModel.findKuh(((MapMarker) view).getName());
                        Toast.makeText(context, "this is "+ kuh.getName(), Toast.LENGTH_SHORT).show();

但不知何故,我的对象的距离总是空的,因为我最终遇到了一个空指针异常。 知道我可能做错了什么吗?

所以,正如@Olli 所说,问题是我的存储库中的线程没有完成执行,这就是它返回空对象的原因。

我只是这样更改了我的代码,现在可以正常工作了

public Kuh findKuh(String kuhName) throws InterruptedException {
        final Kuh[] kuh = new Kuh[1];
        Thread t1 = new Thread(new Runnable() {
            volatile boolean running = true;
            @Override
            public void run() {
                if(running!= true) {
                    return;
                }
                kuh[0] =kuhDAO.findKuh(kuhName);
                running = false;
            }
        });
        t1.start();
        t1.join();
        return kuh[0];
    }