Android 处理程序未使用 HandlerThread 接收消息
Posted
技术标签:
【中文标题】Android 处理程序未使用 HandlerThread 接收消息【英文标题】:Android Handler Not Receiving Message Using HandlerThread 【发布时间】:2019-06-29 00:42:33 【问题描述】:我在下面的代码中使用 HandlerThread 和 Handler,实际上我尝试将数据从 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视图:未捕获的处理程序:线程主因未捕获的异常而退出