В настоящее время я использую 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.
Что я делаю не так?