【问题标题】:Nullpointer Exception on return value from a DAO methodDAO 方法的返回值出现 Nullpointer 异常
【发布时间】:2020-11-17 11:39:17
【问题描述】:

我正在使用 Roomdatabase,当我给出它的名称时,我希望搜索从数据库中获取单个对象。为此,我在 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();

但不知何故,我的对象的 istance 始终为空,因为我最终得到了一个空指针异常。 知道我做错了什么吗?

【问题讨论】:

  • 你正在启动一个新线程,它应该从你的 DAO 中获取对象。此代码在另一个线程上运行,因此程序不会等待它完成。调用 thread.start(); 之后程序立即处理下一行,它试图获取数组的第一个元素。此时,您的线程还没有完成,也没有将对象放入您的数组中。所以 kun[0] 中没有对象。
  • 试试这个:@Query("SELECT * FROM kuh_table WHERE name = :kuhName" AND name IS NOT NULL)
  • @Olli 在这种情况下你将如何等待线程完成?
  • @PrajwalWaingankar 遗憾的是这不起作用,我仍然得到一个 nullpointerException
  • 您应该能够在不使用其他线程的情况下执行此操作。如果 DAO 操作花费太多时间以至于它会冻结 gui,您应该阅读developer.android.com/reference/android/os/AsyncTask 这将为您提供一个覆盖将在后台执行的函数(从 DAO 获取结果)和一个覆盖哪个函数后台线程完成后将在 gui 线程上执行(在 gui 中处理您的 DAO 结果)。只是在你的 getKuh 函数中等待,直到 DAO 操作完成,这与我认为没有线程的情况下是一样的。

标签: android android-layout android-room viewmodel dao


【解决方案1】:

所以,正如@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];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多