关于Android View.post(Runnable ) 的使用

原创 2015年11月18日 07:15:20

  之前认为:view.post(runnable)可以让runnable的run方法在线程中执行,所以我就在run方法里面去做耗时的操作,闹出了笑话。

  查了资料发现:其实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(UI线程).
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。所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应线程的。

具体来说,这个函数的工作原理如下:

View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

前面看到的代码,我们这里Message的callback为一个Runnable的匿名内部类。这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。


Android 自定义View的post(Runnable)方法非100%执行的原因和处理方法解析

最近在写一个需求,需要在view.post(Runnable)方法当中进行一些操作。但是实际使用中(特定场景)发现并不靠谱。得到的现象是: 如果调用了view的post(Runnable)方法,该...
  • Xavier__S
  • Xavier__S
  • 2015年12月11日 10:56
  • 4519

android_View.post(Runnable)在onCreate获取控件宽高分析

在实际开发过程中,我们有时候需要在 activity 中去获取某一个 view 的高度,然后根据该获取的高度去设置其他 view 的高度来达到我们的目的,往往我们都会在 activity#onCrea...
  • lwj_zeal
  • lwj_zeal
  • 2016年10月12日 17:02
  • 1531

Android控件postDelayed用法,View自带的定时器

有一个需求是这样的,点击加关注按钮后,执行关注操作,成功后按钮文字变为“已关注”,保持3秒,三秒后按钮文字便问“取消关注”,点击后执行取消关注的操作 可以使用定时器实现,但是使用View的posyDe...
  • shihui512
  • shihui512
  • 2016年02月29日 21:11
  • 4266

[Android]View.post(),android7.0(sdk24以上)不执行的问题(部分Click点击事件无效的原因)

如果在android7.0(sdk 24及以上)开发过程中,如果你的view没有通过addView添加到视图的时候,就会导致对应view的点击事件无效,以及view.post不执行,可能就是本文原因了...
  • bluewindtalker
  • bluewindtalker
  • 2017年01月03日 19:11
  • 2079

android-View.post与Handler.post的区别

View.postDelayed package android.view; public class View implements Drawable.Callback, KeyEvent.Call...
  • sinat_31057219
  • sinat_31057219
  • 2017年07月04日 10:49
  • 397

解惑Android的post()方法究竟运行在哪个线程中

Android中我们常用的post()方法大致有两种情况:1.如果post方法是handler的,则Runnable执行在handler依附线程中,可能是主线程,也可能是其他线程下面是Handler里...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年06月28日 22:14
  • 4133

android webview模拟网页post操作

  • 2012年01月09日 13:40
  • 1KB
  • 下载

View#post与Handler#post的区别,以及导致的内存泄漏分析

简述: 写这篇文章的缘由是最近项目中查内存泄漏时,发现最终原因是由于异步线程调用View的的post方法导致的。 为何我会使用异步线程调用View的post方法,是因为项目中需要用到很多复杂...
  • a740169405
  • a740169405
  • 2017年04月09日 00:34
  • 5597

Android使用View.post()方法内存泄漏

最近开发中,使用 AsyncTask + ProgressDialog 显示进度信息,但在AsyncTask停止,Activity finish 后该Activity的实例始终不会被gc,多次运行程序...
  • huiguixian
  • huiguixian
  • 2013年08月07日 16:50
  • 5280

Android View.post(Runnable )

Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的:      Handler mHandler=new Handler();      mHandler.p...
  • jf3612797
  • jf3612797
  • 2013年04月10日 13:56
  • 8122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Android View.post(Runnable ) 的使用
举报原因:
原因补充:

(最多只允许输入30个字)