1. handler

参考资料:http://blog.csdn.net/ly502541243/article/details/52062179/

首先说明Android的两个特性:

1. 只能在主线程中更新UI,子线程不能更新

2. 在主线程中不能执行需要耗时过长的方法。(如果有耗时长的方法就扔到子线程去)

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:orientation="vertical"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context=".MainActivity" >
  11.  
  12. <EditText
  13. android:id="@+id/ed_path"
  14. android:text="http://www.itheima.com/uploads/2015/08/198x57.png"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content" />
  17. <Button
  18. android:onClick="getPic"
  19. android:text="查看图片"
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"/>
  22. <ImageView
  23. android:id="@+id/iv_pic"
  24. android:layout_height="wrap_content"
  25. android:layout_width="fill_parent"/>
  26. </LinearLayout>
  1. package com.itheima.picviewer;
  2.  
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6.  
  7. import android.app.Activity;
  8. import android.graphics.Bitmap;
  9. import android.graphics.BitmapFactory;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.view.View;
  14. import android.widget.EditText;
  15. import android.widget.ImageView;
  16. import android.widget.Toast;
  17.  
  18. public class MainActivity extends Activity {
  19.  
  20. protected static final int SUCCESS = 1; //定义的常量, 用于判断 到底是 何种消息
  21. protected static final int ERROR = 2;
  22. EditText ed_path;
  23. ImageView iv_pic;
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. ed_path = (EditText) findViewById(R.id.ed_path);
  30. iv_pic = (ImageView) findViewById(R.id.iv_pic);
  31. }
  32. String path;
  33. //handler 翻译过来表示处理器
  34. Handler handler = new Handler(){
  35.  
  36. public void handleMessage(Message msg) {
  37.  
  38. switch (msg.what) {
  39. case SUCCESS:
  40. Bitmap bitmap = (Bitmap) msg.obj;
  41. iv_pic.setImageBitmap(bitmap);
  42. break;
  43. case ERROR: //失败
  44. //弹土司
  45. Toast.makeText(MainActivity.this, "对不起, 出错了. ..", 0).show();
  46. System.out.println("==========出错了....");
  47. default:
  48. break;
  49. }
  50. };
  51. };
  52. //点击查看图片
  53. public void getPic(View v){
  54.  
  55. //http://www.itheima.com/uploads/2015/08/198x57.png
  56. path = ed_path.getText().toString();
  57. new Thread(){
  58.  
  59. public void run() {
  60.  
  61. try {
  62.  
  63. //构建一个 url对象的实例
  64. URL url = new URL(path);
  65. //使用当前的url 与服务器建立 器连接
  66. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  67. //设置请求的方式
  68. conn.setRequestMethod("GET");
  69. //设置 超时的 时间 为 5 秒
  70. conn.setConnectTimeout(5000);
  71. // 200, 302 , 304, 404, 500
  72. int code = conn.getResponseCode();
  73.  
  74. if(code==200){
  75.  
  76. //进来则表示 , 成功的 接受到了服务器的 响应的数据, 服务器 响应成功
  77. //这个 in 就代表着 返回的 图片数据
  78. InputStream in = conn.getInputStream();
  79. //如何将流的数据转换成一个 图片呢?
  80.  
  81. // 这个 bitmap 就是代表着 一张图片 .
  82. Bitmap bitmap = BitmapFactory.decodeStream(in);
  83.  
  84. //要 将图片 显示 到 ImageView中
  85.                //iv_pic.setImageBitmap(bitmap);
  86. //通过handler 发消息 --Message
  87. //这里 Message.obtain() 避免了 重复 创建 多个 消息,
  88. // 达到了 复用 message. 查看源代码 就可以 了解到 ..
  89. Message msg = Message.obtain();
  90. msg.obj = bitmap;
  91. msg.what=SUCCESS ;
  92. handler.sendMessage(msg);
  93.  
  94. }else{
  95.  
  96. //进来 的话,则说明网络连接 不好使, 也发一个消息, 通知 主线程 给用户 提示
  97. Message msg = Message.obtain();
  98. msg.what=ERROR;
  99. handler.sendMessage(msg);
  100. }
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. Message msg = Message.obtain();
  104. msg.what=ERROR;
  105. handler.sendMessage(msg);
  106. }
  107. };
  108. }.start();
  109. }
  110. }

2. ANR机制

Android中 还有 一套 保护机制, 为了提高用户的感受, 如何一个 应用程序 干了某个耗时的事儿,但是这个耗时的事儿又没有被检测

出来,并且 耗时也的确很长, 那么这个时候, 系统还有另外的一套 保护机制.

如果长时间应用程序无任何响应, 那么会报ANR  (application not responding ),应用程序无响应.

在android 中不同的组件中, ANR机制 生效的时间 也是不一样的 .

在activity中, ANR生效的 时间 是 5 秒钟

在 service中,ANR生效的 时间 是 10秒钟

handler与anr机制的更多相关文章

  1. Android学习笔记——从源码看Handler的处理机制

    可能是出于性能的考虑,Android的UI操作是非线程安全的. 也就是说,如果你在一个新开的线程中直接操作UI是会引发异常的. 但是,Android又规定,不要去阻塞UI线程!否则,轻者引起程序卡顿, ...

  2. Android学习笔记(38):Handler消息传递处理机制

    先说为什么须要Handler: Android的主线程又叫UI线程,用于处理与UI相关的时间.Android仅仅同意在主线程中改动UI组件,当我们在其它线程中须要改动UI界面时.就须要发送消息到主线程 ...

  3. [Android]Handler的消息机制

    最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...

  4. android Handler及消息处理机制的简单介绍

    学习android线程时,直接在UI线程中使用子线程来更新TextView显示的内容,会有如下错误:android.view.ViewRoot$CalledFromWrongThreadExcepti ...

  5. Android中Handler的消息处理机制以及源码分析

    在实际项目当中,一个很常见的需求场景就是在根据子线程当中的数据去更新ui.我们知道,android中ui是单线程模型的,就是只能在UI线程(也称为主线程)中更新ui.而一些耗时操作,比如数据库,网络请 ...

  6. Handler基本运行机制

    Handler,Looper,MessageQueue的基本原理(三个组成一个消息处理机制)最大的作用就是实现线程间的通信 Handler负责把消息对象加入到消息队列当中 Looper(循环器)是一个 ...

  7. android handler传递消息机制

    当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...

  8. Android基本功:Handler消息传送机制

    一.什么是UI线程 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread). 主要负责处理与UI相关的事件. 二.UI线程存在的问题 出于性能优化考虑,Android的 ...

  9. Android Handler 异步消息处理机制的妙用 创建强大的图片加载类(转)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号: ...

随机推荐

  1. WPF自定义进度条

    <!--进度条 4812--> <LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" Sta ...

  2. k8s rc

    RC是用来管理Pod的,每个RC由一个或多个Pod组成:在RC被创建之后,系统将会保持RC中的可用Pod的个数与创建RC时定义的Pod个数一致,如果Pod个数小于定义的个数,RC会启动新的Pod,反之 ...

  3. 由一个场景分析Mysql的join原理

    背景 这几天同事写报表,sql语句如下 select * from `sail_marketing`.`mk_coupon_log` a left join `cp0`.`coupon` c on c ...

  4. django基础2

    一. 使用原生sql,了解即可 使用原生sql的目的:解决一些复杂的sql不能用ORM方式写出的问题 有三种方式如下 1. extra: 结果集修改器,一种提供额外查询参数的机制 2. raw:执行原 ...

  5. 1.HTML练习(二)

    一.表格练习: 1.<table>标签:声明一个表格,它的常用属性如下: border属性             定义表格的边框,设置值是数值 cellpadding属性     定义单 ...

  6. C++基础知识:成员函数、对象拷贝、私有成员

    一.综述 类是我们自己定义的数据类型(新类型) 设计类时要考虑的角度: (1)站在设计和实现者的角度来考虑 (2)站在使用者的角度来考虑 (3)父类,子类 二.类基础 (1)一个类就是一个用户自己定义 ...

  7. QuantLib 金融计算——基本组件之 Index 类

    目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...

  8. python全栈开发_day15_模块学习

    一:模块 1)什么是模块 每一个py文件就是一个模块 导入模块,会编译执行 1.形成一个对应的pyc文件 2.产生该模块自己的店全局名称空间 3.在使用该模块的全局名称空间中产生一个名字(导入的模块名 ...

  9. GeneXus学习笔记——入门篇

    使用GeneXus做开发做了有一段时间了 却发现一个问题(O_O)?就是除了相关的Wiki外 网上其他地方的相关资料都很少 于是乎我就想在这记录一些东西 来帮助以后会用到的人(°ー°") 那 ...

  10. OpenERP 疑问之一

    def _get_send_amount(self,cr,uid,ids,name,args,context=None): res={} MRP={} lines = self.browse(cr,u ...