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

时间:2019-03-27 18:06:36

标签: java android android-asynctask android-room

我是Room数据库的新手,但在过去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));
    }
 }

2 个答案:

答案 0 :(得分:1)

AsyncTask将在单独的线程上执行。无论AsyncTask是否完成执行,您的代码都将执行AsyncTask并立即进入for循环。我将介绍几种处理此问题的方法。

方法1::您可以在AsyncTask自身内部移动for循环。这将确保从数据库中获取数据之后,将执行for循环。

方法2::允许此查询在UI线程上运行。 AFAIK,如果明确提及,Room允许在UI线程上运行查询。

方法3:使用回调。之后,AsyncTask完成,您可以使用回调(使用接口实现),该回调将使您的活动/片段知道AsyncTask已完成,并且您可以继续进行工作。

答案 1 :(得分:0)

顾名思义,AsyncTask正在异步执行...这就是journeys.size()返回0的原因-因为您从未将记录分配给它

AsyncTask.execute(new Runnable() {
    @Override
    public void run() {

        /* first retrieve the data */
        journeys = db.journeyDao().getAllJourneys();
        for(int i = 0; i < journeys.size(); i++){
           listOfJourneys.add(String.format("Journey %d", i));
        }

        /* and then notify the adapter */
        arrayAdapter.notifyDataSetChanged();   
    }
});

请参见documentation