Android 处理程序未使用 HandlerThread 接收消息

Posted

技术标签:

【中文标题】Android 处理程序未使用 HandlerThread 接收消息【英文标题】:Android Handler Not Receiving Message Using HandlerThread 【发布时间】:2019-06-29 00:42:33 【问题描述】:

我在下面的代码中使用 HandlerThreadHandler,实际上我尝试将数据从 runnable 更新为 Handler 回调。

在每个循环中调用了 sendMessage() 函数,但我在回调中没有收到任何内容。 我错过了什么?

public class MainActivity extends AppCompatActivity 

    private TextView result;
    HandlerThread handlerThread = new HandlerThread("bThread");

    Callback callBack = new Callback()

        @Override
        public boolean handleMessage(Message message) 
            Bundle bundle = message.getData();
            String val = bundle.getString("output");
            result.setText(val);

            return false;
        
    ;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        result = findViewById(R.id.result);
        handlerThread.start();
        handler = new Handler(handlerThread.getLooper(),callBack);
        handler.post(runnable);
    

    Runnable runnable= new Runnable() 
        @Override
        public void run() 
            for (int i = 0; i <200 ; i++) 
                try 
                    Message message = new Message();
                    Bundle bundle = new Bundle();
                    bundle.putString("output",i+"");
                    message.setData(bundle);
                    handler.sendMessage(message);
                    Thread.sleep(3000);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        
    ;


【问题讨论】:

检查我的答案。 【参考方案1】:

我认为你的代码可以正常工作

问题在下面一行

             Thread.sleep(3000);

评论这一行并运行您的代码正在运行,或者像下面的代码一样减少一些时间。

    package com.myapplication;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.HandlerThread;
    import android.os.Message;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class HandleActivity extends Activity implements View.OnClickListener 

        private TextView tvMessage;
        private Button btSendMesaage;
        private HandlerThread handlerThread = new HandlerThread("hthread");

        private Handler.Callback callback = new Handler.Callback() 
            @Override
            public boolean handleMessage(Message msg) 
                Bundle bundle = msg.getData();
                String messsage = bundle.getString("output");
                tvMessage.setText(messsage);
private Handler.Callback callback = new Handler.Callback() 
        @Override
        public boolean handleMessage(Message msg) 
            Bundle bundle = msg.getData();
            String messsage = bundle.getString("output");
            tvMessage.setText(messsage);
            try
            Thread.sleep(3000);catch (Exception e)
            return false;
        
    ;

        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.handler_activity);
            initLayout();
            handlerThread.start();
        

        private void initLayout() 
            tvMessage = (TextView) findViewById(R.id.textview);
            btSendMesaage = (Button) findViewById(R.id.button);
            btSendMesaage.setOnClickListener(this);
        

        @Override
        public void onClick(View v) 
            switch (v.getId()) 
                case R.id.button:
                    sendMessage();
                    break;
                default:
                    break;
            
        

        private Handler handler;

        private void sendMessage() 

            handler = new Handler(handlerThread.getLooper(), callback);
            handler.post(runnable);
        

        Runnable runnable = new Runnable() 
            @Override
            public void run() 
                for (int i = 0; i < 200; i++) 
                    try 
                        Message message = new Message();

                        Bundle bundle = new Bundle();
                        bundle.putString("output", i + "");
                        message.setData(bundle);

                        handler.sendMessage(message);

                     catch (Exception e) 
                        e.printStackTrace();
                    
                
            
        ;
    

【讨论】:

评论 sleep 或更改为 Thread.sleep(3); 的目的是什么? 我只是尝试制作像您的代码一样的示例,并在注释其正常工作时仅在这一行中发现了问题。 @appukrb 检查我更新的答案,我只是从 run 方法中删除了 Thared.sleep(3000) 并完美地添加了回调它的工作。

以上是关于Android 处理程序未使用 HandlerThread 接收消息的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse - 在 Android 应用程序上引发未处理的异常时中断用户代码

在 Android 中设置全局未捕获异常处理程序的理想方法

Android视图:未捕获的处理程序:线程主因未捕获的异常而退出

android 应用程序可能出现未处理的 Promise Rejection

android服务如何对未处理的异常做出反应?

android错误“无法在未调用looper.prepare的线程内创建处理程序” [重复]