handler与anr机制
1. handler
参考资料:http://blog.csdn.net/ly502541243/article/details/52062179/
首先说明Android的两个特性:
1. 只能在主线程中更新UI,子线程不能更新。
2. 在主线程中不能执行需要耗时过长的方法。(如果有耗时长的方法就扔到子线程去)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <EditText
android:id="@+id/ed_path"
android:text="http://www.itheima.com/uploads/2015/08/198x57.png"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:onClick="getPic"
android:text="查看图片"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/iv_pic"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
</LinearLayout>
package com.itheima.picviewer; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends Activity { protected static final int SUCCESS = 1; //定义的常量, 用于判断 到底是 何种消息
protected static final int ERROR = 2;
EditText ed_path;
ImageView iv_pic; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_path = (EditText) findViewById(R.id.ed_path);
iv_pic = (ImageView) findViewById(R.id.iv_pic);
}
String path;
//handler 翻译过来表示处理器
Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) {
case SUCCESS:
Bitmap bitmap = (Bitmap) msg.obj;
iv_pic.setImageBitmap(bitmap);
break;
case ERROR: //失败
//弹土司
Toast.makeText(MainActivity.this, "对不起, 出错了. ..", 0).show();
System.out.println("==========出错了....");
default:
break;
}
};
};
//点击查看图片
public void getPic(View v){ //http://www.itheima.com/uploads/2015/08/198x57.png
path = ed_path.getText().toString();
new Thread(){ public void run() { try { //构建一个 url对象的实例
URL url = new URL(path);
//使用当前的url 与服务器建立 器连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求的方式
conn.setRequestMethod("GET");
//设置 超时的 时间 为 5 秒
conn.setConnectTimeout(5000);
// 200, 302 , 304, 404, 500
int code = conn.getResponseCode(); if(code==200){ //进来则表示 , 成功的 接受到了服务器的 响应的数据, 服务器 响应成功
//这个 in 就代表着 返回的 图片数据
InputStream in = conn.getInputStream();
//如何将流的数据转换成一个 图片呢? // 这个 bitmap 就是代表着 一张图片 .
Bitmap bitmap = BitmapFactory.decodeStream(in); //要 将图片 显示 到 ImageView中
//iv_pic.setImageBitmap(bitmap);
//通过handler 发消息 --Message
//这里 Message.obtain() 避免了 重复 创建 多个 消息,
// 达到了 复用 message. 查看源代码 就可以 了解到 ..
Message msg = Message.obtain();
msg.obj = bitmap;
msg.what=SUCCESS ;
handler.sendMessage(msg); }else{ //进来 的话,则说明网络连接 不好使, 也发一个消息, 通知 主线程 给用户 提示
Message msg = Message.obtain();
msg.what=ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what=ERROR;
handler.sendMessage(msg);
}
};
}.start();
}
}
2. ANR机制
Android中 还有 一套 保护机制, 为了提高用户的感受, 如何一个 应用程序 干了某个耗时的事儿,但是这个耗时的事儿又没有被检测
出来,并且 耗时也的确很长, 那么这个时候, 系统还有另外的一套 保护机制.
如果长时间应用程序无任何响应, 那么会报ANR (application not responding ),应用程序无响应.
在android 中不同的组件中, ANR机制 生效的时间 也是不一样的 .
在activity中, ANR生效的 时间 是 5 秒钟
在 service中,ANR生效的 时间 是 10秒钟
handler与anr机制的更多相关文章
- Android学习笔记——从源码看Handler的处理机制
可能是出于性能的考虑,Android的UI操作是非线程安全的. 也就是说,如果你在一个新开的线程中直接操作UI是会引发异常的. 但是,Android又规定,不要去阻塞UI线程!否则,轻者引起程序卡顿, ...
- Android学习笔记(38):Handler消息传递处理机制
先说为什么须要Handler: Android的主线程又叫UI线程,用于处理与UI相关的时间.Android仅仅同意在主线程中改动UI组件,当我们在其它线程中须要改动UI界面时.就须要发送消息到主线程 ...
- [Android]Handler的消息机制
最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...
- android Handler及消息处理机制的简单介绍
学习android线程时,直接在UI线程中使用子线程来更新TextView显示的内容,会有如下错误:android.view.ViewRoot$CalledFromWrongThreadExcepti ...
- Android中Handler的消息处理机制以及源码分析
在实际项目当中,一个很常见的需求场景就是在根据子线程当中的数据去更新ui.我们知道,android中ui是单线程模型的,就是只能在UI线程(也称为主线程)中更新ui.而一些耗时操作,比如数据库,网络请 ...
- Handler基本运行机制
Handler,Looper,MessageQueue的基本原理(三个组成一个消息处理机制)最大的作用就是实现线程间的通信 Handler负责把消息对象加入到消息队列当中 Looper(循环器)是一个 ...
- android handler传递消息机制
当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...
- Android基本功:Handler消息传送机制
一.什么是UI线程 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread). 主要负责处理与UI相关的事件. 二.UI线程存在的问题 出于性能优化考虑,Android的 ...
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类(转)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号: ...
随机推荐
- sql--CONVERT、FOR XML PATH解决实际问题
需求:每个平台分类下的门店,每个门店的名称.图片路径.评分,每个门店下的四个产品的名称.图片路径.评分 思路: 一开始门店动态化好写,用Ajax就行了.但是每个门店下面的产品,每个去请求一次查询有点不 ...
- js自执行函数、调用递归函数、圆括号运算符、函数声明的提升
前言 起因是我要在jquery的ajax中需要根据返回值来决定是否继续发起ajax请求,这是一个有条件的循环,符合条件就跳出.可以使用while循环的,但是想了想还是递归调用好用. 调用递归函数 递归 ...
- 巧用网页开发者工具F12 审查、修改元素、去除广告、屏蔽遮罩
巧用网页开发者工具F12 审查.修改元素.去除广告.屏蔽遮罩 每当打开一个网页的时候,是否为页面有很多广告而烦恼:是否为要操作页面(例如观看超清视频),请先注册登录等等事情而麻烦:是否对网页加锁的视频 ...
- ASP.NET添加Mysql数据源
在ASP.NET的数据源控件上添加mysql数据库连接,首先需要在windows系统下添加mysql的数据源才能在vs中添加数据源 1.在控制面板下打开系统与安全-->打开管理工具-->点 ...
- ES5和ES6作用域
ES5和ES6作用域 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- “全栈2019”Java异常第二十一章:finally不被执行的情况
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 创建maven自定义archetype项目
1.安装Nexus这里是用homebrew安装, brew nexus 安装成功后,默认的访问端口为8081, 我这里的访问地址是http://192.168.99.100:8081 默认用户:adm ...
- [转] Cisco路由器DNS配置
禁用Web服务 Cisco路由器还在缺省情况下启用了Web服务,它是一个安全风险.如果你不打算使用它,最好将它关闭.举例如下: Router(config)# no ip http server 配置 ...
- 高性能缓存服务器Varnish
一.Varnish概述 Varnish是一款高性能的.开源的反向代理服务器和缓存服务器,计算机系统的除了有内存外,还有CPU的L1.L2,甚至L3级别的缓存,Varnish的设计架构就是利用操作系统的 ...
- User类 新增共有属性Current ID
一.题目描述 每个用户有用户编号(id),用户名(name),密码(passwd)三个属性.其中: 用户编号(id)由系统自动顺序编号,用户名和密码都是字母.数字.符合的组合,新用户密码,默认“111 ...