Использование обработчика для Android Room в отдельном потоке - PullRequest
0 голосов
/ 31 мая 2018

В настоящее время я использую Android Room для хранения небольших данных на Android.Теоретически у меня не должно быть проблем с использованием allowMainThreadQueries (), поскольку все мои данные невелики, но для того, чтобы обеспечить будущее моей программе, я пытаюсь переместить все свои вызовы в отдельный поток.На данный момент у меня есть статический обработчик в AppConfig класс, который инициализируется при первоначальном запуске приложения и является видимым во всем приложении:

HandlerThread thread = new HandlerThread("dbHandlerThread");
thread.start();
serviceHandler = new DbHandler(thread.getLooper(),lApp.getBaseContext(),dbName);

DbHandler - это пользовательский класс, который расширяет Handler и имеет следующий конструктор:

DbHandler(Looper looper, Context context, String dbName) {
    super(looper);

    AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, dbName)
            .fallbackToDestructiveMigration().build();

    coDao = db.countOrderDao();
    plDao = db.productListDao();
    pDao = db.productDao();
}

Переопределяет handleMessage (Сообщение сообщения) и в зависимости от сообщения. Что выполняет множество операций вставки / обновления / удаления, все из которых недействительны.

В потоке пользовательского интерфейса внекоторые действия я называю этот код:

Message msg = Message.obtain();
msg.what = AppConfig.SAVE;
//insert some data and args
AppConfig.serviceHandler.dispatchMessage(msg);

Насколько я понимаю, так как обработчик работает на новый поток / петлитель и поскольку поток пользовательского интерфейса не ждет каких-либо выходных данных, не должно быть никаких проблем с этим,Однако каждый раз, когда я вызываю этот код, я получаю ту же ошибку, как если бы я обращался к базе данных непосредственно в потоке пользовательского интерфейса:

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

Что я делаю не так?

1 Ответ

0 голосов
/ 31 мая 2018

Я обнаружил ошибку:

dispatchMessage (msg) переопределяет все потоки и вручную вызывает метод handleMessage, в то время как сообщение send учитывает зацикливатель / поток для обработчика.

Решение:

Замените dispatchMessage (msg) на sendMessage (msg)

...