Android中切换到主线程更新方法

Android-基础 专栏收录该内容
12 篇文章 0 订阅

方法一: view.post(Runnable action)

在子线程中更新UI

   textView.post(new Runnable() {
        @Override
        public void run() {
            textView.setText("更新textView");
        }
    });

如果你的子线程里可以得到要更新的view的话,可以用此方法进行更新。
view还有一个方法view.postDelayed(Runnable action, long delayMillis)用来延迟发送。

方法二:runOnUiThread(Runnable action)

假如该方法是在子线程中
注意:context 对象要是 主线程中的MainActivity,这样强转才可以。

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //此时已在主线程中,更新UI
            }
        });

方法三:Handler机制

首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )
获取到 Handler 后就很简单了,用handler.post(Runnable r)方法把消息处理放在该 handler 依附的消息队列中(也就是主线程消息队列)。
(1)假如该方法是在子线程中

 Handler mainHandler = new Handler(Looper.getMainLooper());
    mainHandler.post(new Runnable() {
        @Override
        public void run() {
            //已在主线程中,更新UI
        }
    });

Handler还有下面的方法:
1.postAtTime(Runnable r, long uptimeMillis); //在某一时刻发送消息
2.postAtDelayed(Runnable r, long delayMillis); //延迟delayMillis毫秒再发送消息
(2): 假设在主线程中

Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case 0:
                    //更新UI等
                    break;
                default:
                    break;
            }
        }
    }

之后可以把 mainHandler 当做参数传递在各个类之间,当需要更新UI时,可以调用sendMessage一系列方法来执行handleMessage里的操作。
子线程中发送消息到主线程更新UI

        /**
      *获取消息,尽量用obtainMessage()方法,查看源码发现,该方法节省内存。
      *不提倡用Messenger msg=new Messenger()这种方法,每次都去创建一个对象,肯定不节省内存啦!
      *至于为什么该方法还存在,估计还是有存在的必要吧。(留作以后深入研究)
      */
    new Thread(new Runnable(){  
            @Override  
            public void run() {  
                //耗时操作,完成之后发送消息给Handler,完成UI更新;  
                mHandler.sendEmptyMessage(0);  

                //需要数据传递,用下面方法;  
                Message msg =new Message();  
                msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
                mHandler.sendMessage(msg);  

                myHandler.sendEmptyMessage(0); //其实内部实现还是和上面一样

                endEmptyMessageAtTime(int what, long uptimeMillis); //定时发送空消息
                sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息
                sendMessageAtTime(Message msg, long uptimeMillis); //定时发送消息
                sendMessageDelayed(Message msg, long delayMillis); //延时发送消息
                sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)    
            }               
        }).start();  


方法四: AsyncTask

  • 1
    点赞
  • 0
    评论
  • 13
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值