我是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));
}
}
答案 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。