在Android系统中,app第一次被启动时,系统会自动为这个app创建一个包含单一Thread的Linux进程。
一、进程
默认情况下,该App的所有组件都会在同一个进程和线程里。(main线程。也称UI线程)。也可以通过定义android:process属性指定组件运行在其他进程里。好处是:让不同app共享一个Linux用户ID、赋予同样的权限。
当然,在lowmemory时,进程销毁也会将这些不同的app都销毁。
二、进程的生命周期
Linux会尽量的利用资源。Android也会尽可能长时间保持进程存活。在资源不足的情况下,就会按照进程 重要性进行清除,以释放资源。1.Foreground process 前台进程
--- 正在使用的Activity、与正在使用的Activity绑定的Service、运行了startForeground的前台服务、正在执行生命周期函数的、正在接受onReceive方法的BroadcastReceiver2.Visible process 可见进程
--- 还可以看到但不在交互的Acitivity。比如showDialog的、与可见但不交互的Activity绑定的Service3.Service Process 服务进程
--- startService启动的服务。这种一般都是执行时间较长的mission。比如下载数据,播放音乐等等4.background Process 后台进程
--- 不可见的Activity(onStop被调用的,按back键退出的Activity)系统为了方便下次使用,放在LRU里头,保留着。但结束了也不影响用户。5.empty Process 空进程
--- 仅用作缓存,改善下次启动时间的。其实资源占用已经被释放了。小结
--- 进程级别的评估用 当前进程运行的最高级别 定级。一个Serivce跟一个在交互的activity,那进程就按照 在交互的activity 为主。进程的级别会因为 其他进程的依赖关系而被提高。
三、主线程
也称UI线程,负责事件派发调用,View绘制。Android的UI组件不是线程安全的。只能从UI线程访问,在程序上,这里应 遵循单线程模型。1.不要阻塞UI线程
2.不要在UI线程外访问UI组件
四、工作线程
要保证程序的响应,关键是不能阻塞UI线程。这需要多线程操作。 public void clickSomething() {
new Thread(new Runnable() {
public void run() {
Bitmap bitmap = loadBitmapFromInternet();
mImageView.setImageBitmap(b);//#报错:不能从分线程访问主线程的View。
}
}).start();
<span style="text-align: center;"> </span><span style="font-family: Arial, Helvetica, sans-serif; text-align: center;">}</span>
解决方法:
1.Activity.runOnUIThread
2.View.post
3.View.postXXXXX
public void clickSomething() {
new Thread(new Runnable() {
public void run() {
Bitmap bitmap = loadBitmapFromInternet();
mImageView.post(new Runnable() {
Public void run() {
setImageBitmap(b);
}
}
}
}).start();
}
4.比较好的办法:AsyncTask.