`
dennies211
  • 浏览: 16906 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

handler中post一个runnable问题

阅读更多
Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的:

Handler mHandler=new Handler();
mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});官方对这个方法的解释如下,注意其中的:“The runnable will be run on the user interface thread. ”

boolean android.view.View .post(Runnable action)

Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.

Parameters:
action The Runnable that will be executed.
Returns:
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.



我们可以通过调用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法执行。

Runnable是一个接口,不是一个线程,一般线程会实现Runnable。

[size=medium][/size]

这里我们看代码 mHandler.post(new Runnable(){  好像是new 了一个 interface, 其实是new的一个实现Runnable的匿名内部类(Inner Anonymous Class),这是很简练的写法。

上面的代码可以看成是: new anonymousClass() implement interface{ [改写interface method]}


Runnable是一个接口,不是一个线程,一般线程会实现Runnable。 所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应线程的。
分享到:
评论

相关推荐

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    * 创建一个Handler对象,使用Handler对象h把Runnable的对象r压入队列 * 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启...

    Android Handler Looper Message 使用示例

    程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按按钮后,会等待3s后显示VIEW才会有打印输出,如果理解了Looper的同步机制后,可以删除3s等待和主线程...

    handler发送和接收message的各种方式

    handler发送和接收message的各种方式 (1)Handler.SendEmptyMessage(what); (2)Handler.obtainMessage(int what, int arg1, int arg2, Object obj).sendYToTarget();...(5)handler.post(Runnable callback)

    Android定时器实现的几种方式整理及removeCallbacks失效问题解决

    实现定时器有很多种方式,在这里我简单的介绍几种方式 (1)使用Handler + Runnable的方式 代码如下: Handler handler = new Handler(); Runnable runnable = new Runnable() {... 然后调用handler.post(runnable);就能启

    android handler.post和handler.sendMessage的区别和联系

    但是我一直有一个困惑,就是handler.post(r)这个方法有什么独特的作用? 通过看源码发现,post这个方法是把任务r转成一个message放进了handler所在的线程中的messageQueue消息队列中,并且是立刻发送的消息,这样...

    Handler与Android多线程详解

    下面是一段大家都比较熟悉的代码: 代码如下:Handler ...上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()

    画闪烁移动小球

    画闪烁移动小球,当小球碰撞到边缘时弹起. ... handler.post(new Runnable() { @Override public void run() { dtest.invalidate(); handler.postDelayed(this, 50); } }); } }

    详解Android使用Handler造成内存泄露的分析及解决方法

    主要介绍了详解Android使用Handler造成内存泄露的分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Thread、Handler和HandlerThread关系详解

    ,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...

    View.post() 不靠谱的地方你知道多少

    这一切,看似很美好,它最终会通过一个 Handler.post() 方法去执行,又避免我们重新定义一个 Handler 对象。 但是,从 Android 7.0(Api level 24) 开始,View.post() 将不再那么靠谱了,你 post() 出去的 Runnable...

    [Android实例] Android 竖着的SeekBar.zip

    [Android实例] Android 竖着的SeekBar 需要的请下载 对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)

    Andorid项目源码|(精华)新浪微博图片缓冲技术

    Andorid项目源码|(精华)新浪微博图片缓冲技术,分享给大家。 对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米) 如何更新

    [Android实例] 面试题集.zip

    [Android实例] 面试题集 需要的请下载 对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米) 如何更新UI,为什么子线程不

    Andorid项目源码(168套).zip

    Andorid项目源码(168套) ,内容都是精华,满足你所有的需求,需要的下载 对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、

    [安卓开源项目]Android-炫酷的3D音乐播放器-各种特效OpenGL.zip

    毕设安卓源码,分享给需要的人。 对于现阶段的Android开发而言,技术深度很大一部分就体现在对...例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米) 如何更新UI,为什么子线程不能更新UI?(美

    [Android实例] 【版主帖推荐】继人员列表,聊天的实现,包括图片,语音.zip

    [Android实例] 【版主帖推荐...handler.post(Runnable) runnable是如何执行的?(字节跳动、小米) Looper无限循环为啥没有ANR(B站) Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handle

    Android_Studio_Handler:Android Handler 执行绪教学

    Android Handler 执行绪...每一个执行绪都可以有一个讯息伫列(Message Queue)和一个循环器(Looper),在Android中建立的UI执行绪具有讯息伫列和一个循环器,其它worker执行绪预设并没有(可使用HandlerThread产生具有讯息

    Android 多线程处理之多线程详解

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程。 1.如果像这样,是可以操作ui,但是run还是走在主线程,见打印出来的Log线程名字是...

    BAT 大厂Android研发岗必刷真题:Android异常与性能优化相关面试问题

    今天来讲一讲在面试中碰到的Android异常与性能优化相关问题: ... 没有使用子线程的Looper的Handler的handlerMessage,post(Runnable)是执行在主线程的 AsyncTask的回调中除了doInBackground,其它都

    Android 简单换肤实例.rar

      new Handler().post(new Runnable() {   @Override   public void run() {   layout.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.bg));   }   });  }  );

Global site tag (gtag.js) - Google Analytics