Бегущая комната БД внутри AsyncTask выдает ошибку - PullRequest
0 голосов
/ 15 ноября 2018

Привет! Я выполняю операцию, которая копирует данные из БД Firebase в БД локальной комнаты. Вот часть doInBackground из моей AsyncTask.

    @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, почему?

1 Ответ

0 голосов
/ 16 ноября 2018

Это не о AsyncTask , а о Firebase .onDataChange в Firebase будет вызываться в MainThread, и, следовательно, вы DatabaseClient.getInstance работаете в MainThread.

Вам не нужно выполнять вызовы Firebase в отдельном потоке, поскольку клиент Firebase справляется с этим.Но когда вы получите ответ от Firebase, его onDataChange будет выполнено в MainThread.

. Я предлагаю вам вызвать Firebase в MainThread, а затем после получения данных в onDataChanged позвонитеAsyncTask, у которого есть вызовы DatabaseClient.getInstance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...