默认情况下,一个程序所有的组件都是运行在同一进程和线程当中的,我们把它叫做main thread,进程又可以包含许多线程,线程被称作为轻量级的线程
进程
安卓的应用程序是不可以控制自己的生命周期的,这份工作是交给安卓运行时来完成的,安卓运行时会根据进程所处的状态来控制程序,进程的重要度越低,则越是会被先杀死,而进程的状态则是靠里面运行的组件来指定的。
在哪里可以指定进程组件运行的进程
manifest文件当中,<activity>,<service>,<provider>,<receiver>
里,我们可以使用android:process属性指定它运行在那个线程,同样的<application>
结点我们也可以指定程序所有组建的运行的线程。
进程的分类
- 前台进程
- 可视进程
- 服务进程
- 后台进程
- 空进程
线程
安卓里的主线程有时称为UI线程,因为它主要负责屏幕界面的绘制以及与用户的交互,所以如果在UI线程里进行一些其他的繁重的任务的话,会造成线程的阻塞,超过5秒以上会出现ANR,ForceClose是因为空指针。我们需要下面两点
- 不要阻塞UI线程
- 不要再UI线程外尝试访问UI组件包(因为UI组件不是线程安全的)
使用AsyncTask
在使用AsyncTask之前我们可以用Handler+Message实现相同的原理,这里我们只介绍AsyncTask。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}