首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么android小工具中的runnable上没有更新视图?

在Android小工具中,Runnable是一个接口,用于定义要在后台线程中执行的任务。它通常用于处理耗时操作,以避免阻塞主线程,从而保持界面的流畅性。

当在Runnable中更新视图时,可能会出现视图没有更新的情况。这是因为在Android中,只有主线程(也称为UI线程)才能更新UI组件,包括视图。如果在非主线程中尝试更新视图,将会引发异常或导致视图不会立即更新。

为了解决这个问题,可以使用Android提供的一些机制来确保在主线程中更新视图。以下是一些常用的方法:

  1. 使用Handler:Handler是Android中的一个类,它允许您将消息发送到主线程的消息队列中,并在主线程中处理这些消息。您可以在Runnable中使用Handler来将更新UI的任务发送到主线程执行。
  2. 示例代码:
  3. 示例代码:
  4. 使用AsyncTask:AsyncTask是Android提供的一个方便的类,用于在后台线程执行异步任务,并在主线程中更新UI。您可以将更新UI的代码放在AsyncTask的回调方法中,例如onPostExecute()方法。
  5. 示例代码:
  6. 示例代码:
  7. 使用runOnUiThread()方法:Activity类提供了一个方便的方法runOnUiThread(),它允许您在主线程中执行代码块。您可以在Runnable中使用该方法来更新UI。
  8. 示例代码:
  9. 示例代码:

需要注意的是,无论使用哪种方法,都应确保在正确的时机调用更新UI的代码。例如,在耗时操作完成后或在合适的生命周期方法中。

推荐的腾讯云相关产品:腾讯云移动应用分析(MTA),它提供了丰富的移动应用数据分析功能,帮助开发者深入了解用户行为和应用性能,优化应用体验。产品介绍链接地址:https://cloud.tencent.com/product/mta

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AndroidMVP模式讲解及实践

可以看到MVC主要目的是为了视图和数据分离,这对于开发大型软件来说更方便进行模块划分,提高编码速度与质量。 AndroidMVC Android世界也经常运用到MVC模式。...在layout制定相应布局文件,然后显示在Activity,用于显示天气信息。这对应于View层,这里View并不是Android开发组件view而是对视图统称....这由对应上面流程Controller—>Model 和Model—->View。 这里流程还算清晰,也便于理解。 MVP为什么? 上面讲解了MVC基础知识,大家可能觉得MVC挺好啊?...而MVP出现实际就是将MVC进行升级,对应Android开发中就是帮助Activity解压。 MVCActivity同时充当了V和C角色,这就属于界限划分不清楚。...我个人觉得MVP没有什么很神秘,因为Android SDK开发,本来就差不多是MVC角色。Activity基本Android开发中最重要一环。

2.7K30

2014-10-27Android学习------布局处理(八)------自定义吐司(Toast)-----城市列表应用程序

说白了这个初始化函数就是在当前窗体添加一个视图 :这个视图就是我们自定义吐司(Toast) 这里也告诉我们一点:如果我们想去实现某个方法,从Android文档中去找 我们需要东西是最合适...这里我们还有明白一点就是:在当前视图上面显示一个小吐司,消息(UI)更新是由当前activity主线程来执行呢,还是由子线程来执行呢?...一般来说Android里面更新视图功能都是由主线程来执行,但是它执行时间间隔相当短,好像只有6秒,如果超过这个时间的话,应用程序会出现anr异常。...Handler在Android是很常用,或是用来更新UI,或是派发任务给子线程去执行,也可以用来产生超时效果,比如用sendMessageDelayed(TASK_TIMEOUT, OUT_TIME...为什么这里这样设置呢?他们有什么作用呢? 方法removeCallbacks方法是删除指定Runnable对象,使线程对象停止运行:首先我们为什么要让这个线程停止运行呢?

62030
  • Android进程和线程

    ---- 当某个应用组件启动且该应用没有运行其他任何组件时,Android 系统会使用单个执行线程为应用启动新 Linux 进程。...决定终止哪个进程时,Android 系统将权衡它们对用户相对重要程度。例如,相对于托管可见 Activity 进程而言,它更有可能关闭托管屏幕不再可见 Activity 进程。...2.可见进程 没有任何前台组件、但仍会影响用户在屏幕所见内容进程。...例如,当用户触摸屏幕按钮时,应用 UI 线程会将触摸事件分派给小工具,而小工具反过来又设置其按下状态,并将无效请求发布到事件队列。UI 线程从队列取消该请求并通知小工具应该重绘自身。...要更新 UI,必须实现 onPostExecute() 以传递 doInBackground() 返回结果并在 UI 线程运行,这样,您即可安全更新 UI。

    1.2K30

    Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

    首先要注意:在布局文件android.support.v4.widget.SwipeRefreshLayout下面只能有一个直接子视图,如果有多个子视图,那么将只展示第一个子视图,后面的子视图将不予展示...复习一下前篇博文《Android开发笔记(一百二十二)循环器视图RecyclerView》,当时我们提到RecyclerView几个方法,却没有实际运用例子,现在正好派上用场了。...SwipeRefreshLayout默认只实现下拉刷新功能,没有拉加载功能;如果我们要用它来做上拉加载,就得想办法自定义控件了。...2、调用RecyclerViewsetOnTouchListener方法,并实现一个触摸监听器传给该方法,监听器也是一样捕获拉事件并进行后续处理。...如果要它实现拉加载还得大动干戈的话,不如直接使用下拉刷新开源框架PullToRefresh,因为PullToRefresh能够实现功能更加强大,如果都要大费周章,为什么我们不用更好呢?

    1.9K30

    Android  Surfaceview绘制与应用

    Android Surfaceview绘制与应用 一.surfaceview与view区别 Android 提供了view进行视图绘制,可以满足大部分会图需求,但在有些时候却是心有余而力不足。...我们知道,view通过刷新来绘制视图android系统通过vsync信号来进行屏幕绘制。刷新时间间隔为16毫秒。如果在16毫秒内完成了索要刷新绘制操作,那么在视觉效果就不会产生卡顿感觉。...它可以说是view孪生兄弟,但他与view还是不同,他与view区别主要在一下几点: view 主要是用于主动更新情况下,而surfaceview主要是用于被动更新情况下,列如频繁刷新。...view在绘制时没有使用双缓冲机制,而surfaceview底层是使用了双缓冲机制。...只要我们在run方法不断绘制就可以实现view及时刷新,当然我们也可以在run方法sleep减少资源消耗。这个值一般在50到100毫秒之间。

    1.3K40

    Android开发笔记(四十七)Runnable接口实现多线程

    该功能例子见《Android开发笔记(十四)圆弧进度动画》 4、有些监听器如果没有得到合适结果,就要持续监听,直到出现合适结果为止。...该功能例子见《Android开发笔记(四十六)手机相关事件》 视图刷新post方法 下列方法用于刷新View自身视图: invalidate : 在UI线程刷新视图 postInvalidate...: 在非UI线程刷新视图 postInvalidateDelayed : 在非UI线程延迟若干时间后刷新视图 为避免误解,这里对invalidate和postInvalidate区别做进一步说明...,实际postInvalidate既可在UI线程调用,也可在非UI线程调用; 2、invalidate只能立即刷新视图,而post方式还有postInvalidateDelayed方法可以延迟一段时间...点此查看Android开发笔记完整目录

    2.2K30

    2014-10-27Android学习------程序源码+知识总结------城市列表应用程序

    地址:http://download.csdn.net/detail/u014737138/8100691 接下来需要补充下这个应用项目中我们还没有学习完知识点: 1.视图更新 在26个字母显示特效程序时候...3).androidInvalidate和postInvalidate区别 Android实现view更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在..., 但是如果我们在activity类中直接使用这个函数,肯定是错,而使用postinvalidate则没有问题 原因就是postinvalidate()函数原理就是使用handler来处理这个更新视图消息...一个activity类我们是怎么实现利益invalidate()函数实现视图更新) 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程通过...android.os.Handler是能发送和处理消息,你需要在Activity中发出更新UI消息,然后再你Handler(可以使用匿名内部类)处理消息(因为匿名内部类可以访问父类变量, 你可以直接调用

    30330

    React Native 启动白屏问题解决方案,教程

    问题分析: 为什么会产生白屏? React Native应用在启动时会将js bundle读取到内存,并完成渲染。这期间由于js bundle还没有完成装载并渲染,所以界面显示是白屏。...白屏给人感觉很不友好,那有没有办法不显示白屏呢? 上文解释了:为什么React Native应用会在启动时候显示一会白屏。既然知道了出现问题原因,那么离解决问题也不远了。...在《React Native Android启动屏,启动白屏,闪现白屏》一文 我们使用是在根视图容器添加一个视图作为启动屏,当js bundle加载并渲染完成后,再将添加视图从根视图上移除。...另外,因为在Android中所有的有关UI操作都必须在主线程,所有我们通过activity.runOnUiThread(new Runnable()...,将对话框显示放在了主线程处理。...由于iOS在JS模块控制启动屏关闭方法和Android第三步:在JS模块控制启动屏关闭方法是一样,这里就不再介绍了。

    2.6K60

    Layout Inspector 支持 3D 视图了!

    最近 Google 团队在 Medium 发布了 Android Studio 4.0 上关于 Layout Inspector 更新情况,原文地址如下: https://medium.com/androiddevelopers...可调试就是你 apk 清单文件 debugable 值为 true ,通过 AS 直接运行在手机或者模拟器应用都是可调试。 我使用自己应用 直达 也体验了一下。...猝不及防打一波广告。直达是我做一个小工具,通知栏快速启动 微信扫码 ,支付宝扫码 ,收能量 ,淘宝搜索页,知乎搜索页 等等。更多快捷方式正在路上!...因为它可以分析任何应用页面,更加强大一些。这跟 Layout Inspector 应用场景是不一样。 除了 PC 工具以外,Android 也有一些解决方法。...最近比较火 Doraemon,来自滴滴开源开发工具就支持了这一功能,同样也支持 3D 展示。同样,它也只支持集成进本应用查看当前布局层级。 那么,有没有办法在手机上实时查看任何应用布局层级呢?

    1.2K30

    Android编程图片加载类ImageLoader定义与用法实例分析

    分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里 没有就加载网络,...*/ private Thread mPoolThread; private Handler mPoolThreadHandler; /** * UI线程Handler */ private Handler...= null) { if (width <= 0) { width = lp.width;// 获取imageview在layout声明宽度 } } if (width <= 0) { // width...相关内容感兴趣读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、...《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》 希望本文所述对大家Android程序设计有所帮助。

    40520

    面试官:View.post() 为什么能够获取到 View 宽高?

    [8] 面试官:为什么 View.post 可以获取到视图宽高?[9] 说一些题外话,Android 面试进阶指南 其实是我在小专栏维护一个付费专栏,且已经有部分付费用户。...探秘 View.post() 还可以怎么获取视图宽高? 最后 小测试:哪里可以获取到 View 宽高? 今天文章会比较轻松,相比前面几篇没有那么大段源码要啃。...注意,到现在,我们得到只是一个 空壳子 View 树,它并没有被添加到屏幕,其实也不能添加到屏幕。所以,在 onCreate() 回调获取视图宽高显然是不可取。...[11] 探秘 View.post()[12] 还可以怎么获取视图宽高?[13] 最后[14] 小测试:哪里可以获取到 View 宽高? 今天文章会比较轻松,相比前面几篇没有那么大段源码要啃。...注意,到现在,我们得到只是一个 空壳子 View 树,它并没有被添加到屏幕,其实也不能添加到屏幕。所以,在 onCreate() 回调获取视图宽高显然是不可取

    1.3K30

    Android编程实现异步消息处理机制几种方法总结

    二、为什么使用Handler Android在设计之时,就封装了一套消息创建、传递、处理机制,作为系统原生异步消息处理机制实现之一,我们需要遵循这样处理机制,该机制另外一种实现是AsyncTask...Android只能通过Handler机制在主线程更新UI?...最根本是解决多线程并发问题。 假如在同一个Activity,有多个线程同时更新UI,且没有加锁,那会导致什么问题呢? UI更新混乱。 假如加锁呢? 会导致性能下降。...第6行:拿到该looper实例mQueue(消息队列) 13到45行:就进入了我们所说无限循环。 14行:取出一条消息,如果没有消息则阻塞。...基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》 希望本文所述对大家Android程序设计有所帮助。

    64741

    Carson带你学Android为什么view.post()能保证获取到view宽高?

    前言 为什么view.post()能保证获取到view宽高?本文将手把手带你深入源码了解view.post() 原理。...AttachInfo创建是在ViewRootImpl构造方法 * 2....主要原因是: 每个Viewpost() 需执行任务,必须得添加到窗口视图-执行绘制流程 - 任务才会被post到消息队列里去等待执行,即依赖于dispatchAttachedToWindow ()...; 若View未添加到窗口视图,那么就不会走绘制流程,post() 添加任务最终不会被post到消息队列里,即得不到执行。...(但会保存到HandlerAction数组里) 上述例子,因为它没有被添加到窗口视图,所以不会走绘制流程,所以该任务最终不会被post到消息队列里 & 执行 c.

    39920

    可能是全网最简单透彻安卓子线程更新 UI 解析

    相信下面的代码大家看过很多遍了,在 onCreate() 生命周期里开启一个线程来更新 UI ,居然没有闪退和异常( 在大概率情况下是没有问题 ) @Override protected...H Handler实例是核心中核心,关键关键,一句话,我们所有消息都需要通过它处理分发,Activity 生命周期、用户触碰事件,一切反馈都是通过这个来交互,如果没有这个,应用就会像一个...Java 程序,运行然后结束,轮询器阻塞让 ActivityThread main 方法持续处于运行状态,根据代码逻辑,非常明显,当 Activity onResume() 方法被触发时会调用...= Thread.currentThread()) { 4746 throw new CalledFromWrongThreadException( // 只有创建视图层次结构原始线程才能访问它视图...setText 方法吗,当 mLayout 不为空时才会进入,而事实只有 View 在 测量 方法里才会对这个值进行赋值,答案也就很明显了,当我们在子线程里 setText 时候,其实只是简单设置了这个控件要显示

    1.1K10

    Handler源码和9个常见问题解答,这些你都掌握了吗?

    Handler是Android消息处理机制,是一种线程间通信解决方案,同时你也可以理解为它天然为我们在主线程创建一个队列,队列消息顺序就是我们设置延迟时间,如果你想在Android实现一个队列功能...Looper死循环为什么不会导致应用卡死,会耗费大量资源吗? 子线程的如何更新UI,比如Dialog,Toast等?系统为什么不建议子线程更新UI? 主线程如何访问网络?...看完上面的代码可能你会有一个疑问,在子线程更新UI(进行Toast)不会有问题吗,我们Android不是不允许在子线程更新UI吗,实际并不是这样,在ViewRootImplcheckThread...系统为什么不建议在子线程访问UI? 这是因为 Android UI控件不是线程安全,如果在多线程并发访问可能会导致UI控件处于不可预期状态,那么为什么系统不对UI控件访问加上锁机制呢?...Handler.post(Runnable r)方法执行逻辑 我们需要分析平时常用Handler.post(Runnable r)方法是如何执行,是否新创建了一个线程了呢,实际没有,这个Runnable

    1.3K00

    面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

    不过如果我们在代码手动调用 View.requestLayout,最终也会走到这里,此时的当前线程就是调用线程,所以这也解释了为什么我们不能在非主线程更新 UI。一定不能在非主线程更新 UI 吗?...为什么 Android 系统要通过 socket 方式让 AMS 向 zygote 发送 fork 应用进程请求?...当然,理论 Android 系统也可以直接创建新进程,但这样做会失去上述优势,导致应用程序启动速度变慢、资源共享效率降低以及启动流程变得复杂。...()、onDraw()总结requestLayout()和invalidate()都是Android中用于更新视图方法,它们区别如下:requestLayout():当视图布局参数(如宽度、高度、...invalidate()用于更新视图内容,只会触发视图绘制流程,性能开销较小。在实际开发过程,需要根据视图变化情况选择合适方法来更新视图

    29730

    浅谈Android中使用异步线程更新UI视图几种方法

    Android中子线程是不能更新ui。...所以我们要通过其他方式来动态改变ui视图, 1、runOnUiThread activity提供一个轻量级更新ui方法,在Fragment需要使用时候要用getActivity.runOnUiThread...创建一个主线程用于接收子线程不断发送消息,通过msg.what判断传递消息类型。 根据类型进行相关ui更新操作。...该类允许执行后台操作并在UI线程更新视图,而不需要操纵线程和处理程序。 AsyncTask被设计为一个辅助类Thread,Handler 并且不构成通用线程框架。用于短时间更新操作。...在使用时候需要继承AsyncTask并重写方法: doInBackground:用于返回结果 onProgressUpdate: onProgressUpdate是在UI线程执行,所有可以对UI

    3.9K31
    领券