当前位置: 首页 > 知识库问答 >
问题:

在单独的线程上使用 Android Room 的处理程序

孔运珧
2023-03-14

我目前正在使用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)并根据msg.what执行各种插入/更新/删除操作,所有这些操作都是无效的。

在UI线程中的一些活动中,我调用此代码:

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

我的理解是,由于Handler在一个新的线程/looper上运行,并且由于UI线程没有等待任何输出,因此应该不会有任何问题。但是,每当我调用此代码时,我都会收到与直接在用户界面线程中访问数据库相同的错误:

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

我做错了什么?

共有1个答案

常睿范
2023-03-14

我发现了错误:

dispatchMessage(msg)覆盖所有线程并手动调用handleMessage方法,而send message则尊重处理程序的循环器/线程。

解决方案:

将dispatchMessage(msg)替换为sendMessage(msg)

 类似资料:
  • 我们有一个注释,允许我们使用一个民意调查消费者来消费Kafka消息。它是为长时间运行的作业而设计的,因此一个线程正在处理消息,而另一个线程仍然可以用于轮询,以防止Kafka认为我们的服务失败,并重新平衡消费者。 我们正在使用Spring AOP。 课程: 我们一次只想处理一条消息,因此标志用于决定是现在处理消息,还是以后重新排队。 用于处理消息(使用),然后将消息回复给Kafka。这是通过

  • 我有一个需要执行一些业务逻辑的处理程序,我希望它在单独的线程池中执行,以不阻塞io事件循环。我已将DefaultEventExecutorGroup添加到管道中,如http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.htmljavadoc和http://netty.io/wiki/new-and-noteworthy-in-4.0.ht

  • 问题内容: 我在处理pyGTK应用程序时遇到一些问题。我给线程一些时间来完成其任务,如果有问题,我还是继续继续,只是警告用户。但是,一旦我继续,该线程就会停止,直到调用gtk.main_quit为止。这让我感到困惑。 相关代码: .................................... 问题答案: 首先,不要继承,使用。 其次,很可能导致您明显的阻塞的原因是它采用了一个默认值为的参

  • 问题内容: 我目前正在开发一个Python应用程序,希望在该应用程序上查看实时统计信息。我想使用它以使其易于使用和理解。 问题是我的Flask服务器应该在我的Python应用程序的最开始处启动,而在最末尾停止。它看起来应该像这样: 因为我需要我的应用程序上下文(用于统计),所以不能使用multiprocessing.Process。然后,我尝试使用threading.Thread,但是Werkze

  • 问题内容: 我有2个FileHandlers可以写出两个单独的文件,并且发生的I / O数量使我的应用程序速度大大降低: 我决定让FileHandlers在单独的线程上运行。 由于它们位于单独的线程上,因此我需要一个“队列”概念,以便这些单独的线程可以轮询此队列并打印出所有传入消息。 我已经对消息进行了预格式化,以便所使用的任何参数在它们实际到达FileHandler中的打印输出之前都不会更改。