Handler的handleMessage()的线程调用问题


public class MainActivity extends Activity {

    private TextView tt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tt = (TextView)findViewById(R.id.tt);
        this.handlerThread.start();
        new Thread() {

            @Override
            public void run() {
                Message msg = Message.obtain();
                if (msg != null) {
                    msg.what = 11;

                }

                //之所以延迟发送消息,而不能是立即发送消息,是因为此时的viewrootImpl还没初始化完成,
                //所以还能在非ui线程修改view
                mH.sendEmptyMessageDelayed(111, 2000);
            }

        }.start();
    }

    private HandlerThread handlerThread= new HandlerThread("chen");
    private Handler mH= new M();
//    private Handler mH= new M(handlerThread.getLooper()); 这样会报错,
//    因为Handler的handleMessage(Message msg)是运行在Handler所绑定的Looper所在的线程中,
//    所以new M(handlerThread.getLooper());是将该handler和handlerThread【非ui线程】绑定在一起
//    ,即Handler的handleMessage(Message msg)【Looper里面回调了handleMessage】是运行在handlerThread线程中,此时如果在handleMessage(Message msg)
//    操作ui就会报错

    class M extends Handler {



        public M() {
            super();
        }

        public M(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
          tt.setText(msg.what + "..." + 
            Thread.currentThread().getName());
        }

    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 GG.Handler.KafkaHandler 的部分源代码,可以从Github上找到完整的源代码。 ``` public class KafkaHandler implements Handler { private String topic; private Properties kafkaProps; private KafkaProducer<String, byte[]> producer; private KafkaConsumer<String, byte[]> consumer; private ExecutorService executor; public KafkaHandler(String topic, Properties kafkaProps) { this.topic = topic; this.kafkaProps = kafkaProps; } @Override public void send(List<Record> records) throws Exception { if (producer == null) { producer = new KafkaProducer<>(kafkaProps); } for (Record record : records) { byte[] payload = record.getValue(); String key = record.getKey(); ProducerRecord<String, byte[]> producerRecord = new ProducerRecord<>(topic, key, payload); producer.send(producerRecord); } producer.flush(); } @Override public void start(HandlerPosition position) throws Exception { if (consumer == null) { consumer = new KafkaConsumer<>(kafkaProps); consumer.subscribe(Collections.singletonList(topic)); } executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { while (true) { ConsumerRecords<String, byte[]> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, byte[]> record : records) { String key = record.key(); byte[] value = record.value(); HandlerPosition newPosition = new HandlerPositionImpl(record.offset(), record.partition(), record.topic()); handleMessage(key, value, newPosition); } } }); } @Override public void stop() throws Exception { executor.shutdownNow(); if (producer != null) { producer.close(); producer = null; } if (consumer != null) { consumer.close(); consumer = null; } } private void handleMessage(String key, byte[] value, HandlerPosition position) { // TODO: handle incoming message } } ``` KafkaHandler实现了GG的Handler接口,可以作为OGG的数据目标进行配置。它通过KafkaProducer将OGG抽取出来的数据发送到指定的Kafka topic,同时通过KafkaConsumer从Kafka中读取数据,然后调用handleMessage方法对数据进行处理。在调用start方法时,KafkaHandler会启动一个线程来不断接收Kafka中的数据。当调用stop方法时,KafkaHandler会关闭KafkaProducer和KafkaConsumer,停止对Kafka的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值