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

活套处理器示例

墨安阳
2023-03-14

我试图理解android中的looper和handler,但被编写的示例卡住了。我想做的是,在线程中添加一个looper,使线程在run()方法中连续运行。然后将消息或runnables发布到hanlder线程。

public class HLClass extends Thread {
        Handler mHandler;
        @Override
        public void run() {
            super.run();
            Looper.prepare();
            mHandler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Log.d("HLClass","In Handler, Msg = "+msg.arg1);
                }
            };
            Looper.loop();
        }
    }

这就是我试图调用处理程序的方式:

HLClass hlc = new HLClass();
          hlc.start();
          Message m = hlc.mHandler.obtainMessage();
          m.arg1 = 10;
          hlc.mHandler.sendMessage(m);

错误:

由以下原因引起:尝试在空对象引用上调用虚拟方法“机器人.os.消息机器人.os.处理程序.getMessage()”

在这里,我真正想了解的是,如何将处理程序附加到线程,然后从任何其他线程发布消息如何安全地将Message或Runnable发布到处理程序而不会出错。

共有2个答案

罗渝
2023-03-14

处理程序是一个组件,可以附加到线程,然后通过简单的消息或可运行的任务在该线程上执行一些操作。它与另一个组件Looper协同工作,后者负责特定线程中的消息处理。

创建处理程序时,它可以在构造函数中获得一个Looper对象,该对象指示该处理程序附加到哪个线程。如果要使用附加到主线程的处理程序,需要通过调用Looper.getMainLooper()来使用与主线程关联的looper。

在这种情况下,若要从后台线程更新 UI,可以创建附加到 UI 线程的处理程序,然后将操作作为 Runnable 发布:

Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            // update the ui from here                
        }
    });

这种方法比第一种方法好得多,但是有一种更简单的方法可以做到这一点...

墨承泽
2023-03-14

您可以尝试使用以下代码发送消息。

final HLClass hlc = new HLClass();
hlc.start();
new Handler().postDelayed(new Runnable() {
     public void run() {
            Message m = hlc.mHandler.obtainMessage();
            m.arg1 = 10;
            hlc.mHandler.sendMessage(m);
     }
}, 300);
 类似资料:
  • 我喜欢使用Lombok,但它需要在IDEs设置中启用注释处理器。因为开发人员使用不同的IDE,CI/CD有自己的编译流程,而且我真的不想解释初级开发人员为什么需要选中此复选框,我正在寻找一种方法来避免选中此复选框。理想的情况下,我想让一个年轻人来运行git clone,然后/格拉德卢跑。Gradle是否可以完全设置注释处理器(无需手动单击)? 如果它能在比IntelliJ IDEA更多的地方工作,

  • 在Spring批处理作业中,我将项目写入目标文件(使用FlatFileItemWriter),并将输入记录“process indicator”字段更新为“processed”/“failed”(使用JdbcBatchItemWriter)。在“物品交易”中实现这一点的最佳方式是什么? 使用CompositeItemWriter(委托FlatFileItemWriter写入文件,委托JdbcBat

  • 数据解析为模型后,下面的任务就是交给处理器做处理。 当然你也可以不编写处理器,使用内置的处理器。 示例 实现Yurun\Crawler\Module\Processor\Contract\IProcessor接口 <?php namespace Yurun\CrawlerApp\Module\YurunBlog\Article; use Imi\App; use Imi\Log\Log; use

  • 本文向大家介绍事件处理示例-PyQt,包括了事件处理示例-PyQt的使用技巧和注意事项,需要的朋友参考一下 按钮接受您的命令 1.在Python Shell或CMD提示符下获取输出 之前,我们深入研究了源代码及其引人入胜的输出。让我在此程序的几个关键部分为您提供帮助: window()是此处的用户定义函数,我们在其中设计并绘制了布局框架。 我们在这里使用了一个使用QDialog()的对话框。您可以

  • 在 webpack 中,所有的预处理器需要匹配对应的 loader。vue-loader 允许你使用其它 webpack loader 处理 Vue 组件的某一部分。它会根据 lang 属性自动推断出要使用的 loader。 CSS 例如,使用 Sass 编译我们的 <style> 语言块: npm install sass-loader node-sass --save-dev <style

  • 得益于 vue-loader, 我们可以通过 lang 属性在组件中的<template>, <script> 或 <style> 上使用各种预处理器。 举个例子,我们在 pages/index.vue 组件中使用 Pug, CoffeeScript 和 Sass: <template lang="pug"> h1.red Hello {{ name }}! </template> <scr