- 浏览: 177870 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
beiizl:
用了博主的方法和代码,不同证书居然可以正常通讯?
Java SSLSocket的使用 -
SHANGLIJAVA:
sorry,运行时没看清。博主的代码确实没问题。。。
Java SSLSocket的使用 -
SHANGLIJAVA:
YoungeeOne 写道最后一个为什么初始化一个空的证书,也 ...
Java SSLSocket的使用 -
q979713444:
那这个的心跳怎么弄呢
Java SSLSocket的使用 -
43350860:
busybox不是每台机器有安装的, 有没有比较裸的办法获取p ...
android中查看端口占用
1. ANR
ANRs (“Application Not Responding”),意思是”应用没有响应“
发生ANR最常见的一种情况: UI线程中执行长时间的任务,如IO或网络操作, 导致UI线程5秒内没有响应输入事件
参考 http://blog.csdn.net/leilu2008/article/details/6689405
2. 如何避免ANR
防止UI线程中执行长时间的任务,避免UI线程阻塞。 以Activity为例,我们应该避免在Activity的生命周期方法中执行耗时操作。
3. 问题
Android系统创建UI线程时,同时在这个线程中启动了一个消息循环(Looper), Looper.loop()源码注释指出该方法可能阻塞。 这里的loop()显然是在UI线程中执行,不会阻塞UI线程吗?为什么没有引起ANR?
ActivityThread.java
public static final void main(String[] args) { ... ActivityThread thread = new ActivityThread(); thread.attach(false); ... Looper.loop(); ... }
Looper.java
public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue; // Make sure the identity of this thread is that of the local process, // and keep track of what that identity token actually is. Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity(); while (true) { Message msg = queue.next(); // might block //if (!me.mRun) { // break; //} if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what ); msg.target.dispatchMessage(msg); if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); // Make sure that during the course of dispatching the // identity of the thread wasn't corrupted. final long newIdent = Binder.clearCallingIdentity(); if (ident != newIdent) { Log.wtf("Looper", "Thread identity changed from 0x" + Long.toHexString(ident) + " to 0x" + Long.toHexString(newIdent) + " while dispatching to " + msg.target.getClass().getName() + " " + msg.callback + " what=" + msg.what); } msg.recycle(); } } }
4. Looper不会阻塞UI线程
Looper不会阻塞UI线程。 原因是,UI线程消息循环开始后, UI线程内发生的所有操作(以Activity为例,比如Activity的生命周期的管理)都是通过这个消息循环来完成。即,Activity的生命回调方法(onCreate, onResume)最终都会以一种间接的方式由这个消息循环来调用。
参考 http://stackoverflow.com/questions/6984263/android-looper-and-call-stack
5. 分析
Activity启动时相关的几个类
注意图中的ActivityManagerProxy和ActivityManagerService,后者为服务端, 前者可以看作它的远程代理。 ActivityThread通过这个代理进行IPC调用。另外, ActivityThread的一个类型为ApplicationThread(可以看出, 它间接地继承自Binder, 并且是ActivityThread的内部类)成员变量作为远程调用的参数被传递给了ActivityManagerService, 这里的ApplicationThread是ActivityManagerService能够调用Activity的回调方法的关键。
Activity启动的时序图
由上图可以看出,一系列调用过程最终结果是一个相应Message进入MessageQueue, 由ActivityThread的一个Handler成员变量进行消息的处理。其处理流程基本可归纳为
handleXXXActivity() ----> performXXXActivity()---->Instrument.callActivityOnXXX()--->Activity.onXXX()
这里的Activit.onXXX()就是我们编写的Activity生命周期方法。
所以说Activity的生命周期方法是通过UI线程的消息循环来完成, 并不存在Looper阻塞UI线程的问题。我们需要注意的就是避免在这些回调方法中执行耗时操作。
发表评论
-
使用Intel HAXM为Android模拟器加速
2013-11-15 17:50 0http://www.tanranran.cn/?p ... -
load bitmap & process bitmap -training系列
2013-11-09 12:11 0http://docs.eoeandroid.com ... -
listview如何高亮显示选中的item
2013-11-03 11:33 0http://stackoverflow.com/qu ... -
ActionBarSharlock配合Navigation Drawer时遇到的小问题
2013-10-27 11:50 0http://stackoverflow.com ... -
Android navi drawer
2013-10-26 21:41 0https://developer.android.c ... -
cache bitmap & display bitmap- training系列
2013-10-26 10:25 0http://developer.android. ... -
博客排版技巧
2013-10-07 18:43 0CnBlogs博文排版技巧 http://www.cnbl ... -
android 传感器之摇一摇
2013-10-07 16:16 0http://blog.csdn.net/xn4545 ... -
android udp广播
2013-10-07 16:14 0http://blog.csdn.net/luzhen ... -
geofence功能
2013-10-07 12:18 0test -
android wifi模块分析
2013-10-04 19:58 0设置、打开wifi热点 http://blog.c ... -
简单试用Android Annotations(2)
2013-10-01 17:15 0一、命名问题 前一篇中提出了一个问题: ... -
简单试用Android Annotations
2013-10-01 11:58 3848参考:试用android annotations ... -
飞鸽协议
2013-09-30 15:13 0http://blog.chinaunix.net/ ... -
zxing二维码
2013-09-30 15:10 0Android之二维码的生成与解析 http://w ... -
android服务发现
2013-09-30 15:06 0不怎么样的博客 upnp研究 http://blog.c ... -
system bin目录下的命令
2013-09-30 13:27 0Android手机WIFI数据开关命令svc教程 h ... -
android jni相关
2013-09-24 14:03 0http://game.ceeger.com/S ... -
service的onStartCommand返回值
2013-09-21 12:16 0http://blog.csdn.net/fr ... -
action bar 2.3
2013-09-20 21:05 0ActionBarSherlock http ...
相关推荐
是一个工具包用来帮助设计和开发 Android 用户界面,包含三个单独的工具:Android Asset Studio用户界面原型模具,Android 设计预览,时常需要重复确认程序版面设计状况的 Android App 开发者,应该会爱上这个轻量级...
我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和...
Android APP 引导页动画效果,这个相信大家都熟悉,是软件入口的闪屏界面,安卓手机APP启动时多图滚动或者手指滑动切换的UI引导页动画效果,本实例引导页使用的pageview适配器,图片的下半部分有几个小圆点,显示...
本文实例讲述了Android编程实现使用handler在子线程中更新UI。分享给大家供大家参考,具体如下: MainActivity代码: package com.example.ui; import android.os.Handler; import android.os.Message; import ...
百度tts语音合成demo Android APP,用百度云语音来进行语音合成工作,官方demo中用了线程锁,这里没用,在UI线程里面。可以做为你的学习设计参考。
通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制)。但是在其他线程中却不能修改UI元素,例如用后台...
ANR(Android not response)现象 ANR解决方案 Android线程 主子线程交互技术 Handler/Message/Looper/MessageQueue 异步任务asynTask IntentService 广播和BrocastReceiver(*)
一个具有登录功能和增删改查功能的app,完善ui界面可以更加完美,可做为课程设计使用。
自己写的,用百度云语音来进行语音合成工作,官方demo中用了线程锁,这里没用,在UI线程里面。
大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制; 使用AsyncTask异步任务; 使用runOnUiThread(action)方法...
import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;...
android多线程断点下载.rar Android手机一键Root原理分析.zip Android手机的VoIP客户端 Sipdroid.rar Android有未接来电后处理(判断未接来电).rar Android模仿乐淘的应用程序分析源码.zip Android游戏源码——忍者快...
开发的android平板端示波器,通过无线蓝牙来获取数据,渲染效果还可以,UI线程不会死
从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os....
Android studio Android SDK11.0,做了一个简单的app。但是控件比较丰富,实践了spinner,textview,button,listview等;用了自定义布局适配器,BaseAdapter,ArrayAdapter等,进行了页面跳转和数据传递,多线程处理...
Stage3_Lesson2Android的多线程与异步任务 Stage3_Lesson3高级商业界面开发 Stage3_Lesson4Android多媒体的世界 Stage3_Lesson5NDK初步 Stage3_Lesson6电话与短信应用 Stage4_Lesson1项目沟通的语言是UML Stage4_...
对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...
Stage3_Lesson2Android的多线程与异步任务 Stage3_Lesson3高级商业界面开发 Stage3_Lesson4Android多媒体的世界 Stage3_Lesson5NDK初步 Stage3_Lesson6电话与短信应用 Stage4_Lesson1项目沟通的语言是UML Stage4_...
Stage3_Lesson2Android的多线程与异步任务 Stage3_Lesson3高级商业界面开发 Stage3_Lesson4Android多媒体的世界 Stage3_Lesson5NDK初步 Stage3_Lesson6电话与短信应用 Stage4_Lesson1项目沟通的语言是UML Stage4_...