View.post()这个方法一般用来做什么?
闭关修行中......
我体会最深的有两个作用:1.大家都知道在onCreate()方法中调用view.getHeight()会返回0,但是你可以在
view.post(new Runnable() { @Override public void run() { MainApp.showToastMsg("" + view.getHeight()); } });
来获取他的高度。2.用View.postDelayed()方法来防止段时间内多次点击view而触发多次不必要的点击事件:
view.setEnabled(false); view.postDelayed(new Runnable() { @Override public void run() { view.setEnabled(true); } },300);
post带一个Runnable,表示Runnable的工作在UI线程执行,可直接在Runnable内对UI进行更新操作,但要注意这里的Runnable不是新开了线程,不要进行太复杂耗时的工作,以免阻塞导致ANR。
View默认带一个Handler,属于mainLooper的,View.post相当于这个Handler.post
View
Handler
mainLooper
View.post
Handler.post
Android的APP在启动后自动启动了一个UIThread即主线程。这个线程主要用来分发用户操作事件、界面绘制事件。所以为了保持较好的用户体验,耗时的操作都会放到其它线程执行,执行完成后再将结果返回到主线程并显示出来。但是,从其它线程是不能直接操作UI的。这是就需要有个线程间传递信息的机制,即Handler和消息队列以及Looper。
Android平台从其它线程访问主线程主要有以下几种方式:Activity.runOnUiThread(Runnable)View.post(Runnable)View.postDelayed(Runnable, long)Handler
View.post背后的运行过程可以参考下面的资料:一种DelayLoad的实现和原理(下篇)看完这篇分析,你就会明白为什么在onCreate中要调用View.post才可以获取一个View的高度
View.post用于将Runnable放入到UI线程的队列中去执行
我体会最深的有两个作用:
1.大家都知道在onCreate()方法中调用view.getHeight()会返回0,但是你可以在
来获取他的高度。
2.用View.postDelayed()方法来防止段时间内多次点击view而触发多次不必要的点击事件:
post带一个Runnable,表示Runnable的工作在UI线程执行,可直接在Runnable内对UI进行更新操作,但要注意这里的Runnable不是新开了线程,不要进行太复杂耗时的工作,以免阻塞导致ANR。
View
默认带一个Handler
,属于mainLooper
的,View.post
相当于这个Handler.post
Android的APP在启动后自动启动了一个UIThread即主线程。这个线程主要用来分发用户操作事件、界面绘制事件。所以为了保持较好的用户体验,耗时的操作都会放到其它线程执行,执行完成后再将结果返回到主线程并显示出来。但是,从其它线程是不能直接操作UI的。这是就需要有个线程间传递信息的机制,即Handler和消息队列以及Looper。
Android平台从其它线程访问主线程主要有以下几种方式:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler
View.post背后的运行过程可以参考下面的资料:
一种DelayLoad的实现和原理(下篇)
看完这篇分析,你就会明白为什么在onCreate中要调用View.post才可以获取一个View的高度
View.post用于将Runnable放入到UI线程的队列中去执行