运行 AsyncTask 中的 room DB 出错
Running room DB inside AsyncTask gives an error
您好,我是 运行 一些将数据从 Firebase DB 复制到本地房间 DB 的操作。
这是我的 AsyncTask 中的 doInBackground 部分。
@Override
protected Void doInBackground(Void... voids) {
contactList = getContactListFromPhone();
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot : dataSnapshot.getChildren())
{
User user = userSnapshot.getValue(User.class);
if (contactList.containsKey(user.getPhone()))
{
UserDB userDB = new UserDB();
userDB.setName(user.getName());
userDB.setPhone(user.getPhone());
userDB.setToken(user.getToken());
//adding to database
DatabaseClient.getInstance(context.getApplicationContext()).getAppDatabase().userDao().insert(userDB);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return null;
}
但是在线 "DatabaseClient.getInstance...." 我收到一个错误:
Cannot access database on the main thread since it may potentially lock the UI for a long period of time
但我已经在 AsyncTask 中了,这是为什么?
这不是关于 AsyncTask,而是关于 Firebase。 Firebase 的 onDataChange
将在 MainThread 中调用,因此您的 DatabaseClient.getInstance
在 MainThread 中是 运行。
您不必在单独的线程中执行 Firebase 调用,因为 Firebase 客户端会处理它。但是当你从 Firebase 得到响应时,它的 onDataChange
将在 MainThread
.
中执行
我建议您在 MainThread 中调用 Firebase,然后在 onDataChanged
中获取数据后,调用具有调用 DatabaseClient.getInstance
.
的 AsyncTask
您好,我是 运行 一些将数据从 Firebase DB 复制到本地房间 DB 的操作。 这是我的 AsyncTask 中的 doInBackground 部分。
@Override
protected Void doInBackground(Void... voids) {
contactList = getContactListFromPhone();
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot : dataSnapshot.getChildren())
{
User user = userSnapshot.getValue(User.class);
if (contactList.containsKey(user.getPhone()))
{
UserDB userDB = new UserDB();
userDB.setName(user.getName());
userDB.setPhone(user.getPhone());
userDB.setToken(user.getToken());
//adding to database
DatabaseClient.getInstance(context.getApplicationContext()).getAppDatabase().userDao().insert(userDB);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return null;
}
但是在线 "DatabaseClient.getInstance...." 我收到一个错误:
Cannot access database on the main thread since it may potentially lock the UI for a long period of time
但我已经在 AsyncTask 中了,这是为什么?
这不是关于 AsyncTask,而是关于 Firebase。 Firebase 的 onDataChange
将在 MainThread 中调用,因此您的 DatabaseClient.getInstance
在 MainThread 中是 运行。
您不必在单独的线程中执行 Firebase 调用,因为 Firebase 客户端会处理它。但是当你从 Firebase 得到响应时,它的 onDataChange
将在 MainThread
.
我建议您在 MainThread 中调用 Firebase,然后在 onDataChanged
中获取数据后,调用具有调用 DatabaseClient.getInstance
.