耗时操作ANR和handler

2023-11-01

耗时操作
1.什么是ANR
在应用程序的主线程中执行一段耗时的代码, 就有可能出现ANR异常.
耗时的代码未执行结束时, 界面会卡住, 用户对界面进行了操作, 10秒之后耗时代码如果还未结束, 就会出现ANR异常
  * 2.怎么避免ANR
主线程中不要执行耗时的代码
如果一定要做耗时的事情, 开启新线程, 在新线程中执行
3.UI Thread
安卓手机中主线程负责刷新界面, 以及处理用户的操作
应用程序的界面都是由主线程创建的
界面的修改也只能在主线程中执行
 ** 4.Handler
有的时候我们需要执行一些耗时的代码, 会开启新线程, 这时又需要更新界面, 必须在主线程中操作, 那么就需要使用Handler来进行线程之间的通信
a.sendMessage():
新线程向主线程发送一个包含数据的消息, 主线程获取消息中的数据
在主线程中创建Handler子类对象, 重写handleMessage()方法
新线程中可以使用Handler的引用调用sendMessage()方法, 发送一个Message对象
只要执行了sendMessage()方法, 那么主线程会自动执行handleMessage()方法, 收到Message对象
b.post():
新线程向主线程发送一段代码, 主线程直接执行
在主线程中创建Handler对象
新线程中可以使用Handler调用post()方法发送一个Runnable对象

主线程会自动执行Runable的run()

运行结果图:


示例代码:

package com.oterman.myhandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	TextView tv1=null;
	TextView tv2=null;
	int j;
	//sendmessage方式;
	Handler msgHandler=new Handler(){
		public void handleMessage(Message msg) {
			tv1.setText(msg.obj.toString());
			
		}
		
	};
	
	Handler postHandler=new Handler();//post方式
	
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv1=(TextView) findViewById(R.id.tv1);
        tv2=(TextView) findViewById(R.id.tv2);

    }
    //按钮一点击相应函数
    public void go1(View v){
    	tv1.setText("军哥好");
    	new Thread(new Runnable() {
			public void run() {
				for(int i=0;;i++){
					//采取发送消息的方式,将主线程要执行的代码封装成消息对象,然后send出去;
					Message msg=new Message();
					msg.obj=i;
					msgHandler.sendMessage(msg);
					
					SystemClock.sleep(1000);
				}
			}
		}){}.start();
    }
    //按钮2的点击响应函数,采用post方式提交要处理的消息给主线程;
    public void go2(View v){
    	tv2.setText("俊哥棒");
    	System.out.println("go:"+Thread.currentThread().getName());
    	new Thread(new Runnable() {
			public void run() {
				for(j=0;;j+=2){
					System.out.println("for:"+Thread.currentThread().getName());
					postHandler.post(new Runnable() {
						public void run() {//主线程要执行的代码;
							System.out.println("post_run:"+Thread.currentThread().getName());
							tv2.setText(j+"");
						}
					});
					SystemClock.sleep(1000);
				}
				
			}
		}){}.start();
    }


}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

耗时操作ANR和handler 的相关文章

  • Android中,Handler是运行在主线程还是其他线程?

    我有以下代码 public class SplashScreen extends Activity private int splashTime 5000 Called when the activity is first created
  • Android 中的 ProgressDialog 关闭

    当我单击列表项时 我想打开一个 ProgressDialog 该列表项从 Web 服务中打开所单击项的数据 ProgressDialog 需要一直显示 直到单击的项目的 WebContent 打开为止 我知道使用进度对话框的代码 但我不知道
  • 在 Javascript 中切换点击处理程序

    我有一个 HTML 按钮 我使用 jQuery 附加了一个事件bind 像这样 mybutton bind click myFirstHandlerFunction In myFirstHandlerFunction 我希望这个处理程序用新
  • char 设备捕获多个(int)ioctl 参数

    我必须编写一个linux char设备 它处理每个unlock ioctl的ioctl 没有BKL 函数 目前 我可以从用户空间 ioctl 命令接收一个参数 get user myint int user arg 我如何接收多个 int
  • postDelayed是否会导致消息跳到队列的前面?

    我在 Android 文档中查找 postDelayed发布延迟的文档 这与另一个问题类似 https stackoverflow com questions 25820528 is postdelayed relative to when
  • 从服务访问 UI 线程处理程序

    我正在 Android 上尝试一些新的东西 我需要访问 UI 线程的处理程序 我知道以下几点 UI线程有自己的处理程序 和活套 任何消息都会被放置 进入UI的消息队列 线 Looper 获取事件 并将其传递给处理程序 处理程序处理消息并 将
  • 多次调用 Looper 会导致“向死线程上的处理程序发送消息”

    我使用 Executor 固定线程池 和我自己的 ThreadFactory 添加了 Looper Handler HANDLER new Handler Executor THREADS Executors newFixedThreadP
  • NServicebus - 一个端点多个处理程序线程

    我有两个端点 端点1 消息处理程序 X 消息处理程序 Y 消息处理程序 Z 网络端点 此时没有处理程序 只是向总线发送命令 发生以下情况 Web gt 发送 端点1 收到消息 端点 1 处理 MessageX 并在 Handler Bus
  • 使用处理程序从服务更新活动

    我想改变 a 的状态ToggleButton in my Activity当事件发生在service 任何人都可以帮我实现这个使用Handler 我的意思是我应该在哪里编写代码来创建处理程序以及如何从服务触发它 我读过类似的帖子 但是它们对
  • 使用计时器更新列表 UI

    我正在尝试更新ListView with timer 我已经实现了 android UI 计时器 但我的问题是如何使用它ListView我需要在一定时间间隔后更新列表的每一行 处理程序如何更新列表的每一行 即假设TextView位于我将显示
  • 我在 Google Play 开发者控制台中遇到的崩溃和 ANR 错误比 Firebase Crashlytics 中的要多。这正常吗?

    过去 30 天内 我在 Firebase Crashlytics 和 Google Play 开发者控制台中看到了我的应用程序的崩溃和 ANR 错误报告 这是我所看到的 Firebase Crashlytics 总共 5 次崩溃 ANR G
  • 更改后重新处理请求

    我正在尝试使用passport js以通用方式 在调用之前更改配置authenticate 但我找不到之后将请求重定向到它的方法 我这样处理请求 入口点 app get authorize clientId network authUtil
  • MySQL 事务难题

    我需要在单个原子事务中执行多次插入 例如 开始交易 插入 插入 commit 然而 当 MySQL 遇到错误时 它只会中止导致错误的特定语句 例如 如果第二个插入语句中有错误 提交仍然会发生 并且第一个插入语句将被记录 因此 当发生错误时
  • Java 中的事件监听器和处理程序有什么区别?

    一般来说 java 中有事件的侦听器和处理程序 我的意思是我在不知不觉中使用它们 只是 API 中可用的 我的问题是 在什么情况下我们使用侦听器以及在什么情况下使用事件处理程序 他们之间有什么区别 特征 我搜索了原因 但找不到 Java 的
  • Android - 延迟加载图像

    我正在尝试伪造某种进度条 我有 X 张图片并想要一张ImageView以一定的延迟向他们展示 我尝试过做这样的事情 for i 2 i
  • 如何处理android中的睡眠模式进入?

    我在任何地方都没有找到它 我该如何处理在android中进入睡眠模式 当Android设备进入睡眠模式时我想做什么 这是可能的还是有办法处理它 只需使用 BroadCastReceivers 进行系统调用 唤醒 睡眠 即可实现此目的 And
  • Python 日志记录:传播低于当前记录器级别的消息

    我想记录特定记录器名称 特定级别及更高级别的消息 例如INFO及以上 到特定的日志处理程序 例如文件处理程序 同时仍然将所有日志消息发送到控制台 Python 的版本是 2 7 到目前为止我尝试的是创建两个记录器 根记录器 命名记录器 对于
  • 找不到记录器的处理程序

    我是Python新手 我正在尝试登录 python 我遇到了找不到记录器的处理程序尝试通过记录器实例打印一些警告时出错 下面是我尝试过的代码 import logging logger logging getLogger logger lo
  • Android 中的处理程序和内存泄漏

    请看下面的代码 public class MyGridFragment extends Fragment Handler myhandler new Handler Override public void handleMessage Me
  • 我想创建处理程序来捕获 Tomcat 上 Web 应用程序的所有日志,并且

    我想创建处理程序来捕获 Tomcat 上 Web 应用程序的所有日志 我创建了我的 Handler 类 编译它并安装 CATALINA HOME lib and common loader有这个目录 之后我修改了logging proper

随机推荐

  • Win7 IIS7解析漏洞复现

    一 漏洞说明 文件上传使用白名单做限制 只能上传图片文件 导致脚本文件无法上传 上传图片马绕过白名单文件上传的验证 但是图片马又无法解析 利用IIS7 5文件解析漏洞的特点 任意文件名 任意文件名 php 从而解析脚本文件 二 搭建环境 1
  • DA14585调试记录--获取蓝牙的MAC地址

    最近在调试DA14585的蓝牙芯片 中间遇到了一些坑 于是就随手将调试的过程记录下来 方便以后自己查看 芯片平台 DA14585 SDK 6 0 12 1020 2 编译工具 Keil5 这次的需求是获取蓝牙的MAC地址 第一反应是去SDK
  • 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号 有时遇到一个感兴趣的公众号时 都会感觉相逢恨晚 想一口气看完所有历史文章 但是微信的阅读体验挺不好的 看历史文章得一页页的往后翻 下一次再看时还得重复操作 很是麻烦 于是便想着能不能把某个公众号所有的文章都保存下来 这样
  • 提升SQLite数据插入效率低、速度慢的方法

    http blog csdn net majiakun1 article details 46607163
  • 关于veriloga和Verilogasm透射思考

    Verilogasm是一个如何诞生的语言系统呢 我认为是用来表达 功能器件的信号处理 的语言系统 有信号处理 那么必然就存在两个问题 1 测试的数据是什么样的 2 观察的器件的功能是如何的 用一个模型表征它结构 如下 首先从功能的角度来分类
  • 使用vscode写vue文件代码有时不提示

    背景 安装了volar插件 但是在vue文件中导入js文件代码不提示 准确来说是有时提示有时不提示 解决方案 插件冲突 卸载 JavaScript ES6 code snippets 插件 这个插件在vue文件中适配不是很好 很有可能是插件
  • 详细解读一下chatGPT模型提取信息和生成回答的过程

    当ChatGPT接收到一个问题时 它首先使用内部的算法将问题转换为机器可理解的格式 例如将问题转换为词向量 然后将其输入到预训练模型中 预训练模型是通过在大规模语料库上训练的神经网络模型 它可以将输入的文本序列转换为一个输出的文本序列 在这
  • vue element el-date-picker日期选择器选择时间区间

    1 在项目中使用到了element日期选择组件 选择日期区间最大为6个月之前是让不在这区间给限制不让选择 html部分
  • JAVA8 List的去重、过滤、映射(map)、分组、统计(sum、max、min、avg)、分页

    目录 1 实现List对象集合的简单去重 distinct 2 实现List集合的根据属性 name 去重 3 实现List对象集合的简单过滤 过滤为 null 的对象 4 实现List对象集合中获取其中某一属性 weight 的List集
  • 二、Shell解析器

    1 Shell解析器有哪些 在linux服务器上面执行如下命令 sudo cat etc shells 可以看到有6种解析器 2 linux默认使用的解析器是哪种呢 使用命令 echo SHELL命令 可以查看到 默认使用的是bash解析器
  • centos 网卡显示Error, some other host already uses address

    1 nmcli已经关闭 2 重启网卡报错 mac地址被占用 最后的解决办法 原因 地址冲突 1 永久解决 换IP地址 2 临时解决 以下方案 vi etc sysconfig network scripts ifup eth 注释下面那五行
  • 软件架构模式+系统架构+架构作图

    架构模式对比 分层模式 一般信息系统中最常见的4层划分如下 Presentation layer 表示层 也就是UI层 Application layer 应用层 也就是服务层 Business logic layer 业务逻辑层 也就是领
  • C语言关于动态内存管理(malloc、calloc、realloc、free)

    动态内存 前言 若是没有动态容量 在创建变量时 只能预先设计好容量 而这样的容量可能会出现过多的浪费或者是容量不足 不能灵活的增加或减少容量 运用好关于动态内存管理的函数 就可以解决这些问题 让我们来了解这些函数吧 一 malloc voi
  • LightGroupButton* sender = static_cast<LightGroupButton*>(QObject::sender());

    当某一个Object emit一个signal的时候 它就是一个sender 系统会记录下当前是谁emit出这个signal的 因此我们可以从对应的槽函数里面获得哪个发送的信号 有可能多个Object的signal会连接到同一个signal
  • 再见2015,一个小白领的格调

    当我一直沉默着做事情的时候 时间就像一条脱缰的野狗一样 肆意狂奔 快到让我忘记了买回老家过冬的衣服便放春节了 以至于现在我还满脑子的考虑穿什么过冬 而不是感叹15年已经过完 2015年1月1日 六个小伙伴在吃烤肉 依次诉说各自的新年计划 我
  • 逆矩阵(inverse matrix)的概念及其意义

    逆矩阵 inverse matrix 的概念及其意义 2015年09月17日 00 09 10 阅读数 21838 标签 逆矩阵为何需要逆矩阵逆矩阵应用逆矩阵实例逆矩阵与倒数 更多 版权声明 本文为博主原创文章 未经博主允许不得转载 htt
  • windows 远程连接debian_有没有xrdp大神,用windows远程debian一片空白。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 补充俩文件吧 分别是以root登录和以另一个非root账号登录的日志 root登录的 20170510 22 30 04 INFO A connection received from ffff
  • 利用el-upload组件在vue中上传文件

    以上传图片为例 action 使用的接口地址 on change 改变时调用的方法 file list 文件列表 limit 限制上传文件的数量 on success 成功后调用的方法 on exceed 文件超出个数限制时调用的方法 更多
  • 为什么你的LDO输出不稳定?

    原文来自微信公众号 工程师看海 前一阵朋友和我说当初用某型号LDO时 发现输出异常 仔细阅读datasheet后 更换输出电容解决 LDO的输出电容对性能至关重要 除了会提高电源抑制比PSRR抑制噪声外 对环路稳定性也至关重要 电容除了容值
  • 耗时操作ANR和handler

    耗时操作 1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 2 怎么避免ANR 主线程中不要执行耗