- 浏览: 180014 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
beiizl:
用了博主的方法和代码,不同证书居然可以正常通讯?
Java SSLSocket的使用 -
SHANGLIJAVA:
sorry,运行时没看清。博主的代码确实没问题。。。
Java SSLSocket的使用 -
SHANGLIJAVA:
YoungeeOne 写道最后一个为什么初始化一个空的证书,也 ...
Java SSLSocket的使用 -
q979713444:
那这个的心跳怎么弄呢
Java SSLSocket的使用 -
43350860:
busybox不是每台机器有安装的, 有没有比较裸的办法获取p ...
android中查看端口占用
(译自Android SDK文档Processes and Threads, 不全)
一. 进程生命周期
There are five levels in the importance hierarchy. The following list presents the different types of processes in order of importance (the first process is most important and is killed last):
importance hierarchy.分为五个等级,最重要的进程最后被杀死。
1. Foreground progress前台进程
前台进程是用户完成当前任务必需的进程。满足以下条件之一的进程为前台进程:
Hosts用户正在与之进行交互的Activity;
1)Hosts被用户正在与之进行交互的Activity绑定的Service
2)Hosts前台Service
3)Hosts正在执行onCreate(),onStart()或onDestroy()的Service
4)Hosts正在执行onReceive()方法的BroadcastReceiver
通常情况下任意时刻仅有少量前台进程。前台进程仅在极端情况下才会被杀死,比如设备内存过低需要进行页面置换。
2. Visible progress可见进程
没有前台组件、但仍影响用户屏幕显示内容的进程即为可见进程。
1)Hosts Visible Activity,即不在前台、但仍然可见的Activity(已调用onPause())。比如某个原本处于前台的Activity弹出一个对话框,则这个Activity现在处于可见状态
2) Hosts被Visible Activity绑定的Service
可见进程非常重要,除非要保证前台进程运行,一般不会杀死可见进程
3. Service progress服务进程
通过startService()方法启动服务的 、且不属于以上两种情况的进程,归为服务进程。服务进程不直接跟用户所见产生关系,但它们通常执行一些用户非常关心的操作,比如在后台播放音乐或下载文件。
4. Background progress后台进程
Hosts对用户不可见的Activity(已调用onStop()方法)的进程为后台进程。这些进程不会对用户体验产生直接影响,所以系统可以在任何时候杀死它们以便为前台进程、可见进程、服务进程回收内存。通常同时存在许多后台进程,它们被保存在LRU(least recently used)队列中,以保证用户最近使用的Activity最后被杀死。如果一个Activity正确地实现了其生命周期方法,并且保存了当前状态,杀死该进程不会对用户体验产生明显影响。
5. 空进程
不持有任何应用组件的进程为空进程。空进程存在的意义是缓存,以加速下次组件的启动速度。
Android尽可能将一个进程往高级别排列。比如,某个进程hosts一个service和一个可见activity,则认为这个进程是可见进程而非服务进程。另外,一个进程的等级也可能因依赖关系而发生变化。一个进程为另一个进程提供服务,则前者等级绝对不可能比后者低。比如,A进程中的 一个content provider为B进程中的一个客户提供服务,或者A进程中的一个service被B进程中的某个组件绑定,则A进程至少与B进程有同样的优先等级。
由于运行service的进程级别比运行后台activity的进程级别高,发起长时间任务(long-running operation)的activity最好通过服务来完成任务,而不是简单地创建一个工作线程,尤其当任务持续时间长过activity自身生命时。比如,一个activity上传图片到网站上,则该activity应当启动一个服务来完成上传操作,当用户离开这个activity时上传工作仍能继续。使用service能保证至少具有service progress优先级,不管这时activity状态如何。基于同样的理由,broadcast receiver也应当利用service而非创建线程来完成耗时操作。
二. 工作线程
程序启动时,系统创建一个main线程用户执行程序。Main线程非常重要,它负责分发事件到相应的UI部件,包括绘图事件(drawing events)。Main线程有时也称作UI线程。
系统并不为每个组件实例创建单独的线程。进程中所有的组件都在UI线程中实例化,对每个组件的系统调用也都从该线程分发。结果,类似于onKeyDown()这样的系统调用都在这个进程的UI线程中运行。
单线程应用程序性能低下。如果所有的操作都在UI线程中进行,类似网络访问或数据库访问之类的耗时操作将会阻塞UI。当UI线程被阻塞,事件不能被分发和处理,包括drawing events。从用户角度,应用死掉了。更糟糕的是,当UI线程阻塞超过5秒钟将会提示ANR。
此外,UI toolkit并非线程安全。所以不能在UI线程以外的其他线程操作UI组件。综上所述,归纳出以下两个简单规则:
1. 不要阻塞UI线程
2. 不要在UI线程以外的线程访问和操作UI组件
来看这段代码,它是一个click listener,用于启动一个线程下载图片并在一个ImageView中展示这个图片:
public void onClick(View v) { new Thread(new Runnable() { public void run() { Bitmap b = loadImageFromNetwork("http://example.com/image.png"); mImageView.setImageBitmap(b); } }).start(); }
一开始,代码看似一切正常。但仔细就会发现,它违反了以上第2条规则:不要从UI线程以外的其他线程访问和操作UI。以上代码会导致未定义和不可预料的程序行为,这种行为难以跟踪和分析。
为了解决这个问题,Android提供了几种方法以便能够从其他线程访问UI线程。方法如下:
1. Activity.runOnUiThread(Runnable)
2. View.post(Runnable)
3. View.post(Runnable, long )
所以,可以用第1种方法将代码改成下面这样
public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png"); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); } }).start(); }
现在的实现是线程安全的了:网络操作在一个单独的线程中完全,而且UI操作也是在UI线程中完成。但问题又来了,当操作变得复杂时,类似的代码会越趋复杂并且难以维护。为了能够在工作线程中完成更加复杂的操作,可以考虑在工作线程中使用Handler来处理来自UI线程的消息。有可能最好的解决方案是继承AsyncTask类,它可以简化需要与UI交互的工作线程。
AsyncTask允许你在UI上执行异步操作。它在工作线程中完成可能产生阻塞的操作,然后在UI线程中发布执行结果,不用自己编码操作线程或Handler。使用AsyncTask时,必须继承AsyncTask并且实现doInBackground()回调方法,这个方法在一个后台线程池中运行。为了能够更新UI,还必须实现onPostExecute(),该方法在UI线程中运行、并且能接收和处理doInBackground()的执行结果。这样,就能安全地更新UI了。
下面是使用AsyncTask来解决前面相同的问题。
public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); } }
发表评论
-
使用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 3899参考:试用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应用程序运行的基础,理解这两个概念对于开发高质量的Android应用至关重要。在Android系统中,每个应用都是一个独立的Linux进程,这意味着它们在各自的沙箱环境中运行,互不影响,提高了...
在Android系统中,进程和线程是应用程序运行的基础,它们决定了程序如何管理和执行任务。深入理解这两个概念对于优化应用性能、提高用户体验至关重要。 首先,我们要明白什么是进程。在计算机科学中,进程是程序的...
Android进程和线程详解.当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。 当启动一个应用程序组件时,如果该应用没有...
Android 中的进程和线程概念是紧密相连的,一个进程可以包含多个线程,每个线程都可以执行不同的任务。在 Android 中,进程和线程的概念是动态运行的,会关心 Task 的概念。Task 的概念是 Android 中的主要概念,...
线程进程的区别于联系,详细介绍.希望对大家有用。如果有不足的地方,麻烦留言。
本项目通过一个Gradle项目展示了如何实现这一功能,并提供了`adb shell ps -t -p -c`命令来查看系统中线程和进程的CPU绑定情况。 首先,我们需要理解安卓系统中的进程和线程概念。在安卓系统中,每个应用都是一个...
http://blog.csdn.net/qq_28690547/article/details/50375997;关于demo的文章详解,有兴趣的童鞋可以看看,解决popupwindow/dialog的BadTokenException异常
Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序不能访问此应用程序所拥有的数据和资源了。 在 Linux 中,一个用户ID 识别一个...
在Android系统中,进程和线程是应用程序执行的基础。每个应用组件的启动都可能伴随着新进程的创建或已有进程的重用。默认情况下,同一应用的所有组件在同一进程中运行,共享一个主线程。这是因为主线程负责处理用户...
在Android系统中,进程和线程是应用程序执行和资源管理的核心概念。这篇文章主要阐述了Android应用如何使用进程和线程,以及系统如何管理和优化这些资源。 首先,Android系统中的进程有五种不同的生命周期状态,...
在性能优化中,合理利用线程和进程至关重要。过多的进程会导致内存消耗增加,而过度使用线程可能会引发上下文切换开销。开发者应根据应用的需求平衡使用,以实现高效、稳定的运行环境。 总之,理解和掌握Android中...
"Android-可保持线程日志统一输出多线程不混乱"这个主题关注的是如何在多线程环境中,有效地组织和打印线程相关的日志,以便于开发者追踪和理解程序执行流程。在多线程环境下,如果不对日志进行适当的管理,不同线程...
Android作为一种的、承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。 进程和线程的基本概念 当一个应用...
在Android应用开发中,理解应用程序模块、任务(Tasks)、进程(Processes)和线程(Threads)的概念至关重要。这些组件是构建高效、响应且资源管理良好的应用程序的基础。 1. **应用程序模块(Application Modules...
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
在Android平台上,多线程下载是一项重要的技术,它允许应用程序同时从服务器获取数据,从而显著提高了文件下载的速度和效率。本教程将深入讲解如何在Android环境中实现多线程下载功能,以及涉及的相关知识点。 首先...
在计算机系统中,进程和线程是执行程序的基本单元。进程是系统资源分配的基本单位,而线程则是调度和执行的基本单位。当我们谈论"线程/进程绑定CPU代码"时,我们通常指的是通过编程手段将特定的进程或线程与特定的...
在Android系统中,进程和线程的通信是应用程序运行的核心组成部分。Android系统为每个应用程序启动一个单独的Linux进程,这个进程在默认情况下承载了应用程序的所有组件,如Activity、Service等。每个应用程序至少有...