运行 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