process and thread android中的进程与线程概念
来源:互联网 发布:快乐大本营网络直播 编辑:程序博客网 时间:2024/05/16 11:31
View:
Content:
1、android系统中进程的概念
在android系统中,当你的应用启动时系统会为其创建一个进程以单线程方式运行,你的应用的所有组件包括Activity和Service都运行在这个主线程内,根据需要你可以自己创建其它的线程来满足应用的需要,比如,你可以为Service开辟一个新的线程来完成费时的任务(这将避免service占有主线程导致Activity报错)。
2、为组件设置android:process属性
如果你想控制组件属于哪个线程,你可以在manifest文件中设置,不同的组件包括<activity>
, <service>
, <receiver>
,都可以设置android:process属性,你也可以在<application>
标签中为所有组件设置默认的android:process属性。
<application android:process="" ...
<activity ...
</activity> </application>
注意:android:process属性是一个String类型,默认的进程名字是你在manifest的中声明的包名。当android:process属性以冒号“:”开始时,这个进程是你的应用私有的;当android:process属性以小写字母开始时,这个进程是全局的可以与其他应用分享,减少对资源的占用。
3、进程的优先级问题
android系统中为维护系统的正常运行,系统可能会kill掉一些进程,android进程的优先级分为5中,当系统决定kill掉一个进程时,系统会选择优先级相对较低的一个进程kill掉。下面是关于一些进程的优先级信息:(由上而下优先级依次降低)
1).前台进程
前台进程是指正在于用户交互的进程,主要包括一下几种情况:
进程包含一个正在于用户交互的Activity;
进程包含绑定到activity的service,而它正在与用户进行交互;
当service调用了startForeground()方法,正以前台的方式运行;
service正在调用自己的生命周期函数是(onCreate()
, onStart()
, or onDestroy()
);
进程包含一个正在运行onReceive()方法的BroadcastReceiver时。
在特定的时间只有很少的前台进程在运行,只有当系统的内存低到一定程度时才会kill掉这个级别的进程。
2).可见进程
可见进程不包含任何前台组件,但它可以影响到用户在屏幕上看到的东西:
当进程包含一个不在前台运行的activity(activity失去焦点)但还是对用户可见(比如,被dialog挡住部分时);
单进程包含一个绑定到可见或一个正在交互的activity时。
3).服务进程
正在运行的service。
4).后台进程
后台进程包括对用户不可见的activity(当activity调用了onStop()方法后)。
5).空进程
所谓的空进程是指不包含任何应用组件的进程,这个进程只是维护缓存,这也是优先级最低的进程。
4、android中的线程(Thread)
当一个应用启动后系统会为应用创建一个主线程,这个主线程又叫做UI线程,主线程创建后android不会再自动的给其它组件创建线程,所有的组件都运行在UI线程中。
注意:UI线程是飞线程安全的,在你的应用中:
1).不要阻塞UI线程
2).不要通过一个UI线程访问另一个UI线程
5、UI线程的线程安全问题
这是一个不推荐的更新UI的例子:(要注意尽量不要在你的代码中这样做)
public void onClick(View v) { new Thread(new Runnable() { public void run() { Bitmap b = loadImageFromNetwork("http://example.com/image.png"); mImageView.setImageBitmap(b); } }).start(); }
解决UI线程安全方法:
1).利用一下特殊方法
例子:这样做是可以的,但你遇到比较复杂的操作时这种方法也变的很复杂,还有更好的解决办法就是使用AsyncTask(异步任务)。
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();
}
2).利用AsyncTask:详细了解
public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); }
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); }
protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); }
}
- process and thread android中的进程与线程概念
- process and thread android中的进程与线程概念
- Android Process and Thread 进程和线程
- Android中的进程(Process)和线程(Thread)
- Android中的进程(Process)和线程(Thread)
- Android中的进程(Process)和线程(Thread)
- Android task process thread 进程与线程
- Symbian Thread and Process 进程和线程
- Process and Thread 进程和线程
- Process and Thread Functions--进程线程函数
- 计算机必知必会:进程process与线程thread
- 进程process与线程thread总结
- 进程process与线程thread总结
- 线程 thread 与 进程 process 的区别
- Process进程、Thread线程
- Android开发中的进程与线程概念
- 进程与线程的区别 What is the difference between process and thread
- 学习笔记之深入浅出MFC 第7章 进程与线程(Process and Thread)
- eclipse debug 使用技巧
- struts2处理流程图
- Android系统学习总结目录
- Activity 应用与用户交互的工具
- Service 支持服务的坚强后盾
- process and thread android中的进程与线程概念
- yii CActiveRecord 查询
- Data Storage 数据存储方式
- 正确使用C++宏定义
- PHP基础
- Qt对C++添加的新特性
- hibernate、proxool配置
- struts2标签<s:property value=""/> ognl和el
- org.hibernate.HibernateException: Proxool Provider unable to load JAXP configurator file: proxool.xml