【发布时间】:2018-11-03 20:25:17
【问题描述】:
我同时使用 Google Firebase 和 Room Database 来存储我创建的 Event 对象,其中包含给定事件的所有详细信息。我使用 Firebase 进行在线存储和用户交互,我使用 Room Database 实现更简单、持久的 RecyclerView。
我的问题是,我用用户半径中的事件填充房间数据库的函数似乎根本没有在异步任务或覆盖 onCreate 方法的房间数据库回调中执行。该函数在主线程上使用时已完全调试,因此我认为它现在无法正常工作的原因与我对异步任务的工作原理缺乏了解有关。
这是我的函数,目前在 Room Database 类的 onCreate 方法中:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference().child("events").child("eventid");
if (ref != null) ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Event event = dataSnapshot.getValue(Event.class);
if (event != null) {
LatLng user_location = new LatLng(current_user.get(0).getLatitude(),
current_user.get(0).getLongitude());
LatLng event_location = new LatLng(event.getLatitude(), event.getLongitude());
int distance_preference = current_user.get(0).getDistance();
double distance_between_user_and_event = SphericalUtil
.computeDistanceBetween(user_location, event_location) / 1609.344;
if (distance_between_user_and_event <= distance_preference) {
eventDao.insert(event);
}
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
在异步任务中,我无法真正调试它,因为它不在主线程上(除非我不知道如何大声笑),并且在 onCreate 中这段代码似乎根本没有执行房间数据库的方法。显然我在这里缺少一些东西。
另外,值得一提的是,我的 EventDao、EventDatabase 和 EventRepository 已经全部调试完毕。我可以在运行时完美地使用它们——只是这个早期的填充任务不起作用!
非常感谢您的帮助!
【问题讨论】:
-
签出this。
-
非常感谢您的评论,但我不相信这会帮助我解决问题。我的函数没有返回任何东西,所以异步不是问题。我只是在房间数据库可用时将每个 UserData 实例添加到房间数据库中,这应该根据该线程所说的内容来工作。我的问题是,如果您尝试在主 UI 线程上执行任何操作,Room Database 将引发异常并使应用程序崩溃。因此,我将所有这些操作移到了一个 asynchtask 中,它们停止了工作,即使它们之前还在工作。但也许我不明白这篇文章。
标签: android firebase firebase-realtime-database android-asynctask dao