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

不确定进度条问题,在错误的线程中释放它,error:android.view.ViewRootImpl$CalledFromWrongThreadException

不确定进度条问题是指在Android开发中,当在错误的线程中释放进度条时,会抛出android.view.ViewRootImpl$CalledFromWrongThreadException异常。

在Android开发中,UI操作必须在主线程中进行,而不是在后台线程中进行。如果在后台线程中尝试操作UI元素,就会抛出CalledFromWrongThreadException异常。

解决这个问题的方法是使用主线程来更新UI元素。可以通过以下几种方式实现:

  1. 使用Handler:在后台线程中创建一个Handler对象,并使用post或sendMessage方法将更新UI的任务发送到主线程的消息队列中。
代码语言:txt
复制
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        // 更新UI元素的代码
    }
});
  1. 使用AsyncTask:AsyncTask是Android提供的一个方便的异步任务处理类,它可以在后台线程执行耗时操作,并在主线程更新UI。
代码语言:txt
复制
private class MyTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        // 后台线程中执行耗时操作
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // 在主线程中更新UI元素
    }
}

// 启动任务
new MyTask().execute();
  1. 使用runOnUiThread方法:Activity类中提供了一个runOnUiThread方法,可以在其中执行更新UI的代码。
代码语言:txt
复制
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // 更新UI元素的代码
    }
});

以上是解决不确定进度条问题的常用方法。在实际应用中,可以根据具体情况选择适合的方式来更新UI元素。对于腾讯云相关产品和产品介绍链接地址,可以参考腾讯云官方文档或咨询腾讯云官方客服获取更详细的信息。

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

相关·内容

笔记55 | 处理CalledFromWrongThreadException错误问题

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

1.6K40

线程 真的不能更新UI ?

那如果我说,我这里这个错误就发生在 主线程,你信吗? 下面是具体代码,handleAddWindow()按在MainActivity onCreate执行。...然后3秒后线程中直接改变Button文字,然后又过一秒,线程再改变button文字。 (其中涉及知识有handler、window。...翻译就是说 只有创建了view树线程,才能访问子view。并没有说子线程一定不能访问UI。...那可以猜想到,button的确实是线程被添加到window,子线程确实可以直接访问,而主线程访问确实会抛出异常。看来可以解释这个错误原因了。 下面就具体分析下。...所以干脆使用单线程模型处理UI操作,使用时用Handler切换即可。 我们再看一个问题,Toast可以线程show吗?

1.2K10

android学习笔记----定时问题

view Android相关view和控件操作都不是线程安全,所以Android才会禁止非UI线程更新UI,对于显式非法操作,比如说直接在Activity里创建子线程,然后直接在子线程操作...UI等,Android会直接异常退出,并提示should run on UIThread之类错误日志信息。...its views便是一个例子,字面意思是只有创建视图层次结构原始线程才能操作View,明显是线程安全相关。...s.说明错误线程更新UI。 总结点: 不能在主线程(UI线程)进行耗时操作,比如连接网络,拷贝大数据,睡眠等操作。 比如连接谷歌网络。...// 一旦计时器被终止,执行线程就会顺利地终止,并且不会再安排任务了。

22510

Android采坑之路(一):怀疑人生,主线程修改UI也会崩溃?

并且是Toast上面报出,常识告诉我Toast线程弹出是会报错,但是应该是提示Looper没有生成错,而不应该是上面所报出错误。那么会不会是生成Looper以后报?...Toast设置Text时候错误。...至于setText之前有详细说过,是ViewRootImpl里面进行checkThread是否线程上面。所以感觉似乎一点问题都没有。...看到这里,我想到了一个可能原因: 那就是我Toast是一个全局静态Toast对象,然后第一次是线程时候show出来,这个时候ViewRootImpl初始化时候就会将子线程对象作为mThread...五、发现原因 那么问题原因找到了: 是项目子线程中有弹出过Toast,然后Toast并没有关闭,又在主线程弹出了同一个对象toast,会造成崩溃。

4.5K20

androidjava.lang.IllegalStateException异常产生原因及解决办法

,搞了好久,其实不同机型有不同效果,我魅族 手机 华硕手机  华为p8上都没有出现这样问题 小米2s 在华为荣耀7 上都出现了这样bug   接下来是分析真正问题原因所在 解决办法很简单,...问题本质就是这样,那什么叫状态不一致,我们得用代码来解析下才能看懂了: 使用时候我们应该都知道,MediaRecorder 和MediaPlayer 用方法有哪些了 if (mMediaPlayer.isPlaying...解决方法:让线程睡眠一定时间,测试后发现1秒几乎是最短时间。...这个错误我下篇文章再介绍我遇到情况是什么样,这里还是回到本bug点子上 出现标题bug就是stop release isPlaying这些函数会出现问题,而出现问题就是java对象状态和NAtive...对象状态不一致导致无法停止,无法释放,无法播放 再往里面说,就是这样:当我们第一次申请了一个MediaRecorder 录音对象,我们java释放掉了,那么谁能告诉我释放是谁对象吗,我当时也纠结了

7K10

EventBus线程分发

EventBus支持线程分发,在上一篇博客EventBus简介以及初步使用,了解到EventBus使用主要涉及事件发送者,以及事件订阅者;对于发送和订阅这两个行为,可以不同线程,这就是EventBus...,订阅处理线程和事件产生位于同一线程。...上面的注解等同如下: @Subscribe(threadMode=ThreadMode.POSTING) ThreadMode.MAIN Android平台,订阅方法将会在UI线程中被调用,如果事件产生是线程...ThreadMode.BACKGROUND Android平台中,事件处理会在background线程调用。...如果post不是线程,那么事件处理会被直接在post线程调用;如果post是主线程,EventBus使用了一个单一background线程,那么所有主线程post事件将会按照队列顺序进入,因此这要求事件处理尽可能快速返回

1.4K30

线程与更新UI,细谈原理

先看看崩溃日志: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created...currentThread不是mThread时候,就会崩溃,报错误是 “只有创建视图层次结构原始线程才能触摸视图” ,看到这里是不是猜到一些了,这个mThread难道就是“创建视图原始线程”...反思 解决了问题,还需要反思下,为什么需要checkThread检查线程呢?...重新运行,线程显示并消失后,点击按钮,不崩溃。 换个手机——三星s9,重新运行,线程Toast没消失之前点击按钮,不崩溃。...所以崩溃原因就是因为Toast第一次线程show时候,新建了一个ViewRootImpl实例,绑定了当前线程也就是子线程到mThread变量。

79320

面试官问我:Andriod为什么不能在子线程更新UI?

卧槽,不按套路出牌啊,果然漂亮女人都难搞定。 1)首先,并非在子线程里面更新UI就一定有问题,如下所示代码,则可以完美更新UI。...总结一下就是刷新页面前会判断当前是否线程,如果不在主线程则抛异常,所以我们开始学Android时候,别人就告诉我们:更新UI一定要在主线程。 那为什么上面第一次没有线程等待时候没有报错呢?...赠送一个知识点:真正把mDecor加到WindowManager上是并显示出来makeVisible()方法实现,ActivityWindow才能正在被使用。...到这里可以事后一支烟了,不是,是总结一下了: 1)ViewRootImpl是ActivityonResume()方法后面创建出来,所以onResume之前UI更新可以线程操作而不报错,因为这个时候...2)安卓系统,操作viwe对象没有加锁,所以如果在子线程更新UI,会出现多线程并发问题,导致页面展示异常。 小伙子分析得很不错,把我打动了,回去等offer吧。

79701

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

相信下面的代码大家看过很多遍了, onCreate() 生命周期里开启一个线程来更新 UI ,居然没有闪退和异常( 大概率情况下是没有问题 ) @Override protected...android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view...H Handler实例是核心中核心,关键关键,一句话,我们所有消息都需要通过处理分发,Activity 生命周期、用户触碰事件,一切反馈都是通过这个来交互,如果没有这个,应用就会像一个...= Thread.currentThread()) { 4746 throw new CalledFromWrongThreadException( // 只有创建视图层次结构原始线程才能访问视图...setText 方法吗,当 mLayout 不为空时才会进入,而事实上只有 View 测量 方法里才会对这个值进行赋值,答案也就很明显了,当我们线程里 setText 时候,其实只是简单设置了这个控件要显示

1.1K10

破局ANR

前言 ANR是Android中经常遇到问题,常规ANR问题,一般可以通过adb日志和trace文件,找到导致ANR原因,但是有很多偶发ANR问题,难以采用常规手段来分析,通过学习字节跳动整治...单单从堆栈已经无法找到罪魁祸首了,但是可以从HISTORY MSG可以看到这个Message运行了7002毫秒,这个就是前面am_anr打印Working Message,也就是导致这次ANR罪魁祸首...六、总结 对于很多偶发ANR问题,其实都是主线程代码,极端情况下,无法高效被执行,同时手机状态又是处于比较卡顿状态,导致dump堆栈无法抓到导致ANR单个或者Message有效堆栈,从而导致很多问题基本无解...其实Raster和Sliver作用就是尽可能地还原发生ANR前,主线程干什么,为什么运行那么久。 顺着这个思路,我思考排除代码设计层面的,就是假设你代码常规运行没有什么问题。...极端情况下,可能运行耗时原因可能有IO,内存,CPU调度,如果尽可能还原发生ANR问题前,主线程IO,内存,CPU调度状态,以及影响他们其他进程线程,那样子很多ANR问题就可以迎刃而解。

1.5K21

Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(二)

2.Android studio项目崩溃报Binary XML file line #2: Error inflating class类错误 可能原因:找不到资源文件: 系统会根据分辨率来选择加载不同...: Thread-8 ERROR/AndroidRuntime(421): android.view.ViewRoot$CalledFromWrongThreadException: Only the...原因在于,Android系统视图组件并不是线程安全,如果要更新视图,必须在主线程更新,不可以线程执行更新操作。...解决办法:线程通知主线程,让主线程做更新操作,并使用Handler对象通知主线程。...,把复杂任务处理工作交给子线程去完成,然后子线程通过handler对象告知主线程,由主线程更新视图,这个过程消息机制起着重要作用。

1.6K30

android消息机制入门

,检查这个更新操作是否是Ui线程里面执行,如果是没有任何问题,如果不是抛出一个运行时异常,CalledFromWrongThreadException 在上一节,我们线程里面访问网络之后,直接调用...ImageView对象setImageBitmap()修改Ui界面了,所以会报错 我们需要,线程里面告诉主线程一个消息,我们要修改界面,把内容Bitmap传递给主线程,让他帮我们修改。...子线程通过Handle发送一条消息,消息被放到消息队列里面, 主线程里有一个Looper消息轮询器 如果轮询器发现了新消息,调用Handle对象handleMessage()来处理消息 Handler...线程成员属性里面定义Handler,直接new Handler匿名内部重写他handleMessage()方法 子线程里面,调用Handler对象sendMessage(msg)方法,把消息放入消息队列...线程handlerMessage重写方法内部,会得到这个Message对象,对what属性进行判断,调用ImageView对象setImageBitmap()方法,把Message对象obj属性放进去

60120

Java基础(JVM垃圾回收+synchronized)

java.lang.Throwable;错误基类是java.lang.Error,异常类基类是java.lang.Exception....这给了对象在被回收之前做一些清理工作机会。例如,可以finalize方法关闭打开文件,释放网络连接,释放数据库资源等。 ​...然而,Java规范并未保证垃圾回收时对象finalize方法一定会被执行。首先,垃圾回收时间是不确定取决于Java运行时环境垃圾回收策略和内存压力情况。...wait()方法可以让持有锁线程进入等待状态,并释放锁;notify()方法可以唤醒一个等待线程,并让重新获取锁。...总的来说,synchronized关键字是Java实现线程同步一个重要工具,它可以帮助我们解决多线程并发访问共享资源时可能出现冲突和数据不一致问题

12410

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

Handler是Android消息处理机制,是一种线程间通信解决方案,同时你也可以理解为天然为我们线程创建一个队列,队列消息顺序就是我们设置延迟时间,如果你想在Android实现一个队列功能...看完上面的代码可能你会有一个疑问,线程更新UI(进行Toast)不会有问题吗,我们Android不是不允许线程更新UI吗,实际上并不是这样ViewRootImplcheckThread...UI重点是创建ViewRootImpl和checkThread所在线程是否一致。...)和VmPolicy(VM策略),这里把严苛模式网络检测关了,就可以线程执行网络操作了,一般是不建议这么做。...系统为什么不建议线程访问UI? 这是因为 Android UI控件不是线程安全,如果在多线程并发访问可能会导致UI控件处于不可预期状态,那么为什么系统不对UI控件访问加上锁机制呢?

1.3K00
领券