我刚刚开始学习Android Studio并且一直在尝试使用处理程序,以便我能够发送'我的程序周围的数据。我的主要活动中有一个Handler例程,用于接收数据。我的问题是如何更新主活动屏幕上的文本控件/字段以显示每两秒更改一次的数据? 如果我获得对控件的引用,然后尝试更新处理程序例程中的文本字段,程序将停止并退出并显示错误。 任何帮助将不胜感激,谢谢 约翰
我的代码:
public Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
ArrayList<Integer> receiveData = new ArrayList<>();
Bundle bundle = msg.getData();
receiveData =bundle.getIntegerArrayList("channels");
System.out.println("array data = " + receiveData);
EditText dataText = (EditText) findViewById(R.id.data); // causes error !
dataText.setText(String.valueOf(receiveData));
}
答案 0 :(得分:1)
Android阻止与主线程之外的UI元素进行任何类型的交互,因此解决问题的最快方法是在UI线程中运行UI更新代码,如下所示:
public Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
ArrayList<Integer> receiveData = new ArrayList<>();
Bundle bundle = msg.getData();
receiveData = bundle.getIntegerArrayList("channels");
System.out.println("array data = " + receiveData);
runOnUiThread() { new Runnable() {
EditText dataText = (EditText) findViewById(R.id.data);
dataText.setText(String.valueOf(receiveData));
}
}
}
}
答案 1 :(得分:0)
处理程序可能会使您的代码过于复杂且难以阅读和维护。我建议使用EventBus。基本上,您注册您的活动/片段以接收特定事件的更新,并在您收到它时更新UI。 看一下EventBus,它非常易于使用,非常适合做你想做的事情“ '发送'我的程序中的数据” : - )< / p>
答案 2 :(得分:0)
您需要添加以下Handler
代码: -
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//Your code here
}
});
构建Handler.Callback
Handler
答案 3 :(得分:0)
首先为定义循环处理程序添加此行,
private Handler loophandler = new Handler(Looper.getMainLooper());
并每3秒添加一次此代码以进行循环。
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
loophandler.postDelayed(new Runnable() {
@Override
public void run() {
// insert your code
}
}, 0);
}
}, 0, 3000);
timer.cancel();
关闭计时器并关闭循环