博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速切换到主线程更新UI的几种方法
阅读量:6319 次
发布时间:2019-06-22

本文共 2763 字,大约阅读时间需要 9 分钟。

hot3.png

方法一: view.post(Runnable action)

假如该方法是在子线程中

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)来切换到主线程。

方法三: Handler机制

首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )

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;                case 1:                     //更新UI等                    break;                default:                    break;            }        }    }

 

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

如上代码,只是发送了个消息标识,并没有传其他参数。 

如果想传递参数,可以这样:

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); //其实内部实现还是和上面一样
  •  

发送消息的其他方法有:

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

方法四: 使用AsyncTask

转载于:https://my.oschina.net/u/3698786/blog/1555048

你可能感兴趣的文章
用masterpage后页面定位
查看>>
使用开源免费类库在.net中操作Excel
查看>>
谁占用了我的端口 占用我的文件
查看>>
教你vs里面进行上网(程序员偷偷上网专用)
查看>>
Merge Sort 归并排序
查看>>
ASCII码和c库函数
查看>>
Asp.net页面常用处理解决方法
查看>>
MySQL 数据库性能优化之索引优化
查看>>
[轉]asp利用adsi操作IIS
查看>>
研究音频编解码要看什么书
查看>>
SmartARM3250 CF卡使用说明
查看>>
Parametrilayze based on SRL16 shift register FIFO
查看>>
AndroidManifest.xml配置文件详解 .
查看>>
程序崩溃后如何更好的反馈信息
查看>>
存储过程学习(3)例子
查看>>
eclipse No projects are found to import 的解决
查看>>
POJ-3414 Pots BFS+记忆路径
查看>>
android EditText内嵌图片
查看>>
App竞品技术分析 (3)减小安装包的体积(转)
查看>>
com.microsoft.sqlserver.jdbc.SQLServerException: 结果集没有当前行
查看>>