首页
学习
活动
专区
工具
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

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

相关·内容

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

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

62330

Android中MVP模式讲解及实践

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

2.8K30
  • 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、调用RecyclerView的setOnTouchListener方法,并实现一个触摸监听器传给该方法,监听器中也是一样捕获上拉事件并进行后续处理。...如果要它实现上拉加载还得大动干戈的话,不如直接使用下拉刷新的开源框架PullToRefresh,因为PullToRefresh能够实现的功能更加强大,如果都要大费周章,为什么我们不用更好的呢?

    2.1K30

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

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

    2.3K30

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

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

    30630

    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.7K60

    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.3K30

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

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

    1.4K30

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

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

    41520

    可能是全网最简单透彻的安卓子线程更新 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吗,实际上并不是这样的,在ViewRootImpl中的checkThread...系统为什么不建议在子线程中访问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()用于更新视图的内容,只会触发视图的绘制流程,性能开销较小。在实际开发过程中,需要根据视图的变化情况选择合适的方法来更新视图。

    31530

    笔记55 | 处理CalledFromWrongThreadException错误问题

    报错说明 直接在子线程更新UI会报CalledFromWrongThreadException错,错误如下: 12-20 15:39:04.730: E/AndroidRuntime(2763):...72) 12-20 15:39:04.730: E/AndroidRuntime(2763): at java.util.Timer$TimerImpl.run(Timer.java:284) 为什么会出现这个问题...,这里有一篇大神的解答关于为什么不能再子线程中更新UI的讨论大神对代码的解读能力让人兴叹,总结来说是因为子线程没有创建Looper.prepare()这个与子线程不能Toast的问题是一样的Toast为什么不可以在子线程里面运行...Activity.runOnUiThread(Runnable); 2. Handler(sendMessage(Message) or post(Runnable)); 3....AsyncTask ; 我用的是第一种方案: 把这个Runnable对象传给runOnUiThread(Runnable)。

    1.7K40

    Android经典面试题之View的post方法和Handler的post方法有什么区别?

    在 Android 开发中,View.post(Runnable action) 和 Handler.post(Runnable r) 是两种常见的方法,用于在合适的时机将任务提交到主线程的消息队列中执行...View.post(Runnable action) 1、 附加到视图的消息队列:View.post 方法会将任务附加到与该视图相关联的 Handler 的消息队列中执行。...这意味着在运行任务时,可以确保视图已经完成了测量和布局,视图树也已经准备就绪。 3、 使用场景:通常用于需要操作视图并确保视图已经参与到布局中的任务。例如,如果你想在视图完全渲染之后执行某些操作。...(100); } }); Handler.post(Runnable r) 1、 附加到 Handler 的消息队列:Handler.post 方法会将任务附加到一个特定的 Handler 关联的消息队列中执行...public void run() { // 此时任务将在附加到 Handler 的线程中执行,这里是主线程 // 可以是更新UI或者其他任务 } }); 总结

    51310

    ——Handler源码和常见问题的解答

    子线程的如何更新UI,比如Dialog,Toast等?系统为什么不建议子线程中更新UI? 主线程如何访问网络? 如何处理Handler使用不当造成的内存泄漏?...看完上面的代码可能你会有一个疑问,在子线程中更新UI(进行Toast)不会有问题吗,我们Android不是不允许在子线程更新UI吗,实际上并不是这样的,在ViewRootImpl中的checkThread...(View.java:7125) at android.view.View.performClickInternal(View.java:7102) 所以在线程中更新UI的重点是创建它的...系统为什么不建议在子线程中访问UI? 这是因为 Android 的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?...Handler.post(Runnable r)方法的执行逻辑 我们需要分析平时常用的Handler.post(Runnable r)方法是如何执行的,是否新创建了一个线程了呢,实际上并没有,这个Runnable

    2K20

    View三问—斗鱼真题

    Android作为一种前端语言,view肯定是占据着很重要的位置,熟用view也是我们必须具备的能力,今天就来看看view相关的那些问题: Activity、View、Window三者如何关联?...onCreate,onResume,onStart里面,什么地方可以获得宽高 为什么view.post可以获得宽高,有看过view.post的源码吗?...,那些Runnable并没有马上被执行,而是保存到RunQueue里面,然后通过executeActions方法执行,也就是通过handler,post了一个延时任务Runnable。...performDraw(); } 可以看到在performTraversals方法中执行了,但是在view绘制之前,这是因为在绘制之前就把需要执行的runnable封装成Message发送到MessageQueue...---- Android开发者们,快来关注公| 众 |号【码上积木】,每天三问面试题,并详细剖析,助你成为offer收割机。 相信积累的力量。

    58420
    领券