Android 子线程更新UI:handle和runOnUiThread()

原创 2016年06月01日 11:35:20

在Android开发中,更新UI只能主线程进行更新,若子线程更新UI,会报错:

E/AndroidRuntime(1516):android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

只有原始的创建视图层次的线程才可以修改它的视图。
主线程之外的线程更新UI有两种方法:handle和runOnUiThread()

界面效果图:
这里写图片描述

1.handle
思路:在主线程onCreate(Bundle savedInstanceState)创建继承Handle的实例,子线程发送handle更新消息,handle实例在handleMessage(Message msg)回调函数中更新UI

public class MainActivity extends Activity implements OnClickListener{
    private TextView tvUpdate;
    private Button btnUpdate;
    private UIHandle mHandle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvUpdate = (TextView)findViewById(R.id.tv_update);
        btnUpdate = (Button)findViewById(R.id.btn_update);
        btnUpdate.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mHandle = new UIHandle();
        UIThread mThread = new UIThread();
        mThread.start();
    }

    private class UIThread extends Thread{
        @Override
        public void run() {
            Message msg = new Message();
            Bundle data = new Bundle();
            data.putString("color", "白色");
            msg.setData(data);
            mHandle.sendMessage(msg);
        }
    }

    private class UIHandle extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle dataBundle = msg.getData();
            String color = dataBundle.getString("color");
            tvUpdate.setText(color);
        }   
    }
}

2.使用runOnUiThread(Runnable),把更新UI的代码创建在Runnable中,然后在需要更新UI时,把这个Runnable对象传给runOnUiThread(Runnable)。 这样Runnable对像就能在UI主程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。

public class MainActivity extends Activity implements OnClickListener{
    private TextView tvUpdate;
    private Button btnUpdate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvUpdate = (TextView)findViewById(R.id.tv_update);
        btnUpdate = (Button)findViewById(R.id.btn_update);
        btnUpdate.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        UIThread mThread = new UIThread();
        mThread.start();
    }

    private class UIThread extends Thread{
        @Override
        public void run() {
            runOnUiThread(new Runnable() {  
                @Override
                public void run() {
                    tvUpdate.setText("白色");
                }
            });
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 更新UI的两种方法——handler和runOnUiThread()

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线...
  • dj0379
  • dj0379
  • 2016年03月25日 13:25
  • 911

runOnUiThread和在子线程运行

// A instance of Activity         ....         .      runOnUiThread(new Runnable() {          pu...
  • ndzj981479673
  • ndzj981479673
  • 2014年08月12日 16:51
  • 1110

Android:UI更新方法四:在Worker Thread中runOnUiThread直接刷新UI

activity_main.xml:
  • annkie
  • annkie
  • 2013年01月12日 14:48
  • 11075

Android 处理子线程与UI交互的简单方法runOnUiThread

很多人都知道handler的使用方法。。都用它来处理UI和数据间的传递,不过这东西有的人认为麻烦。还得存,传,取三步。所以今天给大家介绍一种简单的处理方式。其实UI子线程中的数据传递,有4种方法:1....
  • yujian5285
  • yujian5285
  • 2013年06月18日 12:18
  • 1113

handle与多线程

handle的post的方法: Post   对于Handler的Post方式来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()方法。一般...
  • bestone0213
  • bestone0213
  • 2015年01月18日 14:58
  • 1102

Android初级开发----用Handle机制更新UI界面

引入: 之前对Android讲义的一个小项目——–随指尖移动的小球进行修改,利用View中的invalidate()方法实现每次触碰屏幕更新(UI线程)小球的位置并且附加判断大小,实现触碰更新小球大...
  • dh626995617
  • dh626995617
  • 2016年04月01日 12:51
  • 696

Android 更新UI的两种方法——handler和runOnUiThread()

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线...
  • luckyjda
  • luckyjda
  • 2013年02月22日 10:59
  • 34493

Android 更新runOnUiThread()

Activity类的runOnUiThread方法你用过吗,如果你对于Android的Thread+Handler方式感觉繁琐,不妨试试Activity提供的另外一种简单的方法runOnUiThrea...
  • qingzi635533
  • qingzi635533
  • 2013年09月24日 18:00
  • 10376

Android——使用Handle和Message更新UI控件

最近在写一个使用Android端访问PCweb服务端的测试应用,需要在进行网络通信,而android网络通信需要异步执行,一开始是直接用AsyncTask的方法在MainActivity中写代码,一切...
  • a591193965
  • a591193965
  • 2015年11月20日 19:20
  • 2472

安卓handler机制和RunOnUi方法都能修改主线程,两者的区别

今天一个哥们说他去公司面试,碰到这个问题:安卓handler机制和RunOnUi方法都能修改主线程,两者的区别。 拿给我看,也是不甚了解,所以这里我们先看下app的运行机制: 从图中我们可...
  • qq_22603017
  • qq_22603017
  • 2015年07月12日 03:07
  • 1916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 子线程更新UI:handle和runOnUiThread()
举报原因:
原因补充:

(最多只允许输入30个字)