广告
返回顶部
首页 > 资讯 > 移动开发 >探讨:你真的会用Android的Dialog吗?
  • 893
分享到

探讨:你真的会用Android的Dialog吗?

dialogAndroid 2022-06-06 10:06:51 893人浏览 泡泡鱼
摘要

一个Bug前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的: 代码如下:java.lang.IllegalArgumentException:

一个Bug
前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:
代码如下:
java.lang.IllegalArgumentException: View not attached to window manager
    at Android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
    at android.view.Window$LocalWindowManager.removeView(Window.java:400)
    at android.app.Dialog.dismissDialog(Dialog.java:268)
    at android.app.Dialog.access$000(Dialog.java:69)
    at android.app.Dialog$1.run(Dialog.java:103)
    at android.app.Dialog.dismiss(Dialog.java:252)
    at xxx.onPostExecute(xxx$1.java:xxx)

首先是Google了下,发现引发这个的原因基本上都一致都是Dismiss对话框的时候,Activity已经不再存在。常发生这类Exception的情形都是,有一个费时的线程操作,需要在显示一个ProgressDialog,在任务开始的时候显示一个对话框,然后当任务完成了再Dismiss对话框,如果在此期间如果Activity因为某种原因被杀掉且又重新启动了,那么当Dismiss的时候WindowManager检查发现Dialog所属的Activity已经不存在了,所以会报IllegalArgumentException: View not attached to window manager.
其实此类Exception的一重要的原因是,ProgressDialog的创建显示和取消都允许在非UI线程中进程。在Android当中非UI线程是不允许操作UI相关的事情,比如添加移除View等,但是为会么允许创建显示和取消对话框呢?而且还有可能引发此Exception导致应用Crash。
要想避免此类Exception,就要正确的使用对话框,也要正确的使用线程。
正确的使用对话框
不要在非UI线程中使用对话框创建,显示和取消对话框。
那么对于异步操作显示对话框怎么办呢?Activity都有相应的操作对话框的回调比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。这些因为都是Activity的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全
另外就是一定要让对话框对象在Activity的可控制范围之内和生命周期之内,比如一定要是它的成员变量,并且在让对话框变量活跃在Activity的onCreate()和onDestroy()之间。
正确的使用线程
尽量少用单独线程,除非是真正的费时操作才用线程,线程也不要直接用Java式的匿名线程,除非是那种单纯的操作,操作完成后不需要做其他事情的。
尽可能多用Android提供的类比如AsyncTask等。另外如果线程操作过程中还需要与主线程有交互,那么最好保存一个线程的对象,并且线程内部最有一定的控制,这样可以让Activity更好的操控线程。
如果说某些操作是特别费时的,且是经常性的操作,比如从网络获取数据,或是从后台读取文件,或是导入/导出,恢复/备份的事情,最好放到后台Service中去做,然后在StatusBar中给出相应进度。

您可能感兴趣的文章:android控件封装 自己封装的dialog控件android中ProgressDialog与ProgressBar的使用详解Android中自定义对话框(Dialog)的实例代码Android实现点击AlertDialog上按钮时不关闭对话框的方法Android中Dialog去黑边的方法android dialog自定义实例详解android自由改变Dialog窗口位置的方法Android开发笔记之:Dialog的使用详解Android Dialog详解及实例代码


--结束END--

本文标题: 探讨:你真的会用Android的Dialog吗?

本文链接: https://www.lsjlt.com/news/27773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 探讨:你真的会用Android的Dialog吗?
    一个Bug前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的: 代码如下:java.lang.IllegalArgumentException:...
    99+
    2022-06-06
    dialog Android
  • 你真的会用Mysql的explain吗
    目录引言explain基础1、id2、select_type3、table4、partitions5、typeexplain分析实战总结引言 数据库性能优化是每个后端程序猿...
    99+
    2022-11-13
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗
    Dialog和Toast所有人肯定都不会陌生的,这个我们平时用的实在是太多了。而Snackbar是Design Support库中提供的新控件,有些朋友可能已经用过了,有些朋友...
    99+
    2022-06-06
    snackbar 技巧 dialog toast Android
  • Java中你真的会用Constructor构造器吗之看完本篇你就真的会了
    引言 相信大家对于java里的构造器应该都是有了解的,这次我们来了解一些构造器的不同使用方式,了解构造器的调用顺序,最后可以灵活的在各种情况下定义使用构造器,进一步优化我们的代码; ...
    99+
    2022-11-12
  • 你真的会使用Java的方法引用吗
    目录前言方法引用是什么?方法引用与Lambda表达式方法引用的使用静态方法引用实例方法引用对象方法引用构建方法引用总结前言 Java 8由Oracle公司于2014年3月18日发布...
    99+
    2022-11-12
  • Python重定向Windows框架:你真的会用吗?
    Python是一种高级编程语言,被广泛应用于各种领域,包括数据分析、人工智能、Web开发等等。在Windows操作系统下,Python提供了一种方便的方法来重定向标准输入、输出和错误流,即Windows框架。但是,很多人并没有充分利用这个...
    99+
    2023-09-29
    重定向 windows 框架
  • 说说字符串转 OffSetDateTime 你真的会用吗
    字符串转 OffSetDateTime 你真的会用 要创建OffsetDateTime ,需要日期 (日,月和年), 时间 (小时,分钟,秒和纳秒)和偏移量 (与UTC的差异)。 如...
    99+
    2022-11-12
  • MySQL连接查询你真的学会了吗?
    1.内连接查询概要        内连接是应用程序中非常常见的连接操作,它一般都是默认的连接类型。内连接基于连...
    99+
    2022-11-12
  • sql_slave_skip_counter,你真的用对了吗?
    写在前面:    最近一段时间都在做传统主从复制相关的测试,思考了很多上线主从复制架构后,可能会发生的问题,然后针对性设置了这些故障,再然后思考如何在保证业务可用,或者对业务冲击尽可能的小的前提下,进行故障...
    99+
    2022-10-18
  • Java 断言 assert 你真的会用嘛?
    Java assert 断言机制是 Java 5 中推出的新特性,它主要用于在程序运行时检查状态或假设的正确性,并在不正确时抛出 AssertionError 异常。使用 assert 断言可以使代码更加健壮、可靠,提高程序的可维护性和可读...
    99+
    2023-09-06
    java jvm 开发语言
  • 你真的会Python吗?看看这个关于go和numpy的教程!
    Python是一门广受欢迎的编程语言,因其易学易用和强大的功能而备受推崇。但是,有很多人在学习Python时会遇到一些挑战,尤其是在处理大规模数据时。为了解决这个问题,人们开始使用一些其他的编程语言和库,例如Go和NumPy。 在本篇文章中...
    99+
    2023-10-20
    numpy shell laravel
  • 你真的会用ABAP, Java和JavaScript里的constructor么?
    如果constructor里调用了一个成员方法,这个方法被子类override了,当初始化一个子类实例时,父类的构造函数被的调用,此时父类构造函数的上下文里调用的成员方法,是父类的实现还是子类的实现?你能不用运行代码,就能准确说出这些语句会...
    99+
    2023-06-02
  • 你真的会 Java 存储吗?这些 LeetCode 编程算法将考验你的实力!
    Java 存储是 Java 编程的重要组成部分,对于 Java 开发人员来说,精通 Java 存储是非常必要的。在实际开发中,我们经常需要使用存储技术来存储和处理数据,而且 Java 提供了多种存储技术,例如文件存储、数据库存储等。但是,想...
    99+
    2023-09-01
    存储 leetcode 编程算法
  • 你真的了解Linux下API的用法吗?
    Linux下的API是指应用程序接口,是操作系统提供给应用程序的一组接口,它们允许应用程序与操作系统进行交互和通信。对于Linux开发者来说,熟练掌握Linux下API的用法是非常重要的,本文将为大家介绍Linux下API的用法及其实例演示...
    99+
    2023-09-30
    数组 linux api
  • 你真的会写java吗?希望你看完后也能成为合格的Java工程师
    技术点本文不是一个吹嘘的文章,不会讲很多高深的架构,相反,会讲解很多基础的问题和写法问题,如果读者自认为基础问题和写法问题都是不是问题,那请忽略这篇文章,节省出时间去做一些有意义的事情。讲述方向由于一直从事移动互联网相关工作,java开发中...
    99+
    2023-06-02
  • 二维码在 Python API 面试中的应用,值得探讨吗?
    随着科技的发展和普及,二维码已经成为了人们日常生活中不可或缺的一部分。在 Python API 面试中,二维码也被广泛应用。本文将探讨二维码在 Python API 面试中的应用,并给出相关演示代码。 一、二维码在 Python API ...
    99+
    2023-06-02
    api 面试 二维码
  • 你真的了解 Python 在 Linux 中的应用吗?
    Python 是一种高级编程语言,被广泛应用于各种软件开发和数据科学领域。在 Linux 操作系统中,Python 更是成为了必不可少的工具。在本文中,我们将探讨 Python 在 Linux 中的应用,并演示一些常见的代码示例。 Pyth...
    99+
    2023-09-07
    linux shell leetcode
  • 你真的了解PHP中的引用符号(&)吗
    引言 最近接手了五六年前的老项目,用的是CI2.0框架,在看框架源码的时候有个地方让我楞了一下,于是有了这篇文章。 字符&的最早历史可以追溯到公元1世纪,最早是拉丁语et ...
    99+
    2022-11-12
  • Django函数:Go开发技术中的一种必备工具,你真的会使用吗?
    Django函数是一种在Go开发技术中非常重要的工具,它可以简化开发过程,提高开发效率。然而,很多开发者并不熟悉Django函数的使用,这篇文章将会介绍Django函数的基本概念和用法,并通过示例代码来演示如何使用Django函数。 一、...
    99+
    2023-10-26
    开发技术 django 函数
  • SpringBoot 拦截器妙用你真的了解吗
    HandlerInterceptor 详解 HandlerInterceptor 允许定制 handler 处理器执行链的工作流接口。我们可以自定义拦截器用于拦截 handlers ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作