快速切换到主线程更新UI的几种方法

方法一: view.post(Runnable action)

假如该方法是在子线程中ide

textView.post(new Runnable() {
        @Override
        public void run() {
            textView.setText("更新textView");
            //还能够更新其余的控件
            imageView.setBackgroundResource(R.drawable.update);
        }
    });

 

方法二: activity.runOnUiThread(Runnable action)

public void updateUI(final Context context) {
        ((MainActivity) context).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //此时已在主线程中,能够更新UI了
            }
        });
    }

若是没有上下文(context),试试下面的方法: 
1.用view.getContext()能够获得上下文。 
2.跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。oop

方法三: Handler机制

首先在主线程中定义Handler,Handler mainHandler = new Handler();(必需要在主线程中定义才能操做主线程,若是想在其余地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )post

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毫秒再发送消息spa

(2): 假设在主线程中线程

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

 

/**
      *获取消息,尽可能用obtainMessage()方法,查看源码发现,该方法节省内存。
      *不提倡用Messenger msg=new Messenger()这种方法,每次都去建立一个对象,确定不节省内存啦!
      *至于为何该方法还存在,估计仍是有存在的必要吧。(留做之后深刻研究)
      */
    Message msg = myHandler.obtainMessage();
    msg.what = 0; //消息标识
    myHandler.sendMessage(msg); //发送消息

如上代码,只是发送了个消息标识,并无传其余参数。 
若是想传递参数,能够这样:code

msg.what = 1;  //消息标识
      msg.arg1=2;   //存放整形数据,若是携带数据简单,优先使用arg1和arg2,比Bundle更节省内存。
      msg.arg2=3;   //存放整形数据
      Bundle bundle=new Bundle();
      bundle.putString("dd","adfasd");
      bundle.putInt("love",5);
      msg.setData(bundle);
      msg.obj=bundle;   //用来存放Object类型的任意对象
      myHandler.sendMessage(msg); //发送消息

总结: msg.obj它的功能比较强大一下,至于它和利用Bundle传递数据,那个会效率高一些,更节省内存一些。我的认为:从传递数据的复杂程度看,由简单到复杂依次使用,arg1, setData(), obj。会比较好一些。对象

固然能够用简化方法sendEmptyMessage(int what)来减小没必要要的代码,这样写:内存

myHandler.sendEmptyMessage(0); //其实内部实现仍是和上面同样
  •  

发送消息的其余方法有:get

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

方法四: 使用AsyncTask

相关文章
相关标签/搜索