Android Studio - 使用新的传入数据更新文本字段

时间:2015-10-28 12:01:41

标签: android android-activity android-studio

我刚刚开始学习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));

    }

4 个答案:

答案 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();关闭计时器并关闭循环
  • 您可以添加要重复的代码(公共无效运行)