安卓进程线程那些事

来源:互联网 发布:37传奇霸业宝石数据 编辑:程序博客网 时间:2024/05/20 10:24

默认情况下,一个程序所有的组件都是运行在同一进程和线程当中的,我们把它叫做main thread,进程又可以包含许多线程,线程被称作为轻量级的线程

进程

安卓的应用程序是不可以控制自己的生命周期的,这份工作是交给安卓运行时来完成的,安卓运行时会根据进程所处的状态来控制程序,进程的重要度越低,则越是会被先杀死,而进程的状态则是靠里面运行的组件来指定的。

在哪里可以指定进程组件运行的进程
manifest文件当中,<activity>,<service>,<provider>,<receiver>里,我们可以使用android:process属性指定它运行在那个线程,同样的<application>结点我们也可以指定程序所有组建的运行的线程。

进程的分类

  1. 前台进程
  2. 可视进程
  3. 服务进程
  4. 后台进程
  5. 空进程

线程

安卓里的主线程有时称为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");     } }
0 0
原创粉丝点击