如何正确解析数据或使用会议室数据?

我是房间数据库的新手,但在过去的1.5周里一直在研究它。我最近遇到了一个问题。


我无法解析旅程列表的大小。当我尝试时,即使我使用全局变量,它也总是返回0。我相信,这是由于覆盖方法。


我正在尝试获取变量。有什么办法可以解决这个问题吗?这也是在一个片段中。numberOfJourneys = journeys.size


private JourneyDatabase db;

private List<Journey> journeys;

private int numberOfjourneys;


 public void arrayAdapter(){

    db = Room.databaseBuilder(getContext(), JourneyDatabase.class, "MyJourneyDatabase").build();


    AsyncTask.execute(new Runnable() {

        @Override

        public void run() {

            journeys = db.journeyDao().getAllJourneys();

            // journeys.size returns the correct size all the time

        }

    });


    numberOfJourneys = journeys.size();

    // journeys.size() returns 0 all the time

    for(int i=0; i<numberOfJourneys; i++){

        listOfJourneys.add(String.format("Journey %d", i));

    }

 }


繁星coding
浏览 83回答 2
2回答

冉冉说

将在单独的线程上执行。您的代码将执行 AsyncTask,并将立即进入循环,而不管 AsyncTask 是否完成其执行。我将提到一些你可以处理这个问题的方法。AsyncTaskfor方法 1:您可以将循环移动到 AsyncTask 本身内部。这将确保 for 循环在从 db 获取数据后执行。for方法 2:允许在 UI 线程上运行此查询。AFAIK,如果明确提及,则房间允许在UI线程上运行查询。方法 3:使用回调。在 AsyncTask 完成后,您可以使用回调(使用接口实现),这将使您的活动/片段知道 AsyncTask 已完成,您可以继续工作。

拉风的咖菲猫

顾名思义,正在异步执行 ...这正是返回那里的原因 - 因为你从来没有分配过记录。AsyncTaskjourneys.size()0AsyncTask.execute(new Runnable() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; /* first retrieve the data */&nbsp; &nbsp; &nbsp; &nbsp; journeys = db.journeyDao().getAllJourneys();&nbsp; &nbsp; &nbsp; &nbsp; for(int i = 0; i < journeys.size(); i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;listOfJourneys.add(String.format("Journey %d", i));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; /* and then notify the adapter */&nbsp; &nbsp; &nbsp; &nbsp; arrayAdapter.notifyDataSetChanged();&nbsp; &nbsp;&nbsp; &nbsp; }});请参阅文档。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java