每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作。

在android app开发的过程中,为了保证我们的应用程序保持响应,一个好的实践就是将执行缓慢的、计算耗时的操作从应用程序的主线程移进一个子线程中,否则,将会发生ANR的错误,或者造成主线程堵塞,主界面刷新异常。所有的Android应用程序——包括Activity、Service和Broadcast Receivers——在应用程序主线程中启动。因此,任何组件中耗时的进程将会阻塞包括Service和不可见的Activity等其他组件。你不仅仅只想避免这种情况的发生,更不想对话框关闭。那就是用后台线程处理这些耗时操作吧,包括文件操作、网络查找、数据库事务和复杂计算。

开发音乐播放器在线歌词下载的过程中,在第一次进入播放界面时,下载歌词,会造成主线程的堵塞,UI刷新异常,使用了Handle+Thread的实现了非主线程更新UI界面,其实很简单,思路如下:

1 在子线程中实现歌词的后台下载,代码如下:

/**************************************************** * the new thread for download the lrc in background */private void DownloadThread(){new Thread(new Runnable() {                                            @Override                      public void run() {                             try{                    SearchLyric search = new SearchLyric(mService.getTrackName(),mService.getArtistName());                              ArrayList<String> result = search.fetchLyric();                             DownloadLrc(result);                   } catch (RemoteException ex) {                          finish();                      } catch (NullPointerException ex) {                          // we might not actually have the service yet                          ex.printStackTrace();                      }                      mHandler.sendEmptyMessage(READ_LRC);                    }                  }).start();                }

2 当下载完成以后,通过 mHandler.senEmptyMessage(READ_LRC)消息给主线程,在主线程中进行相关的UI处理:

private final Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {         case READ_LRC:             相关的操作,开始启动读取歌词的线程;             break;     }}


通过handle+thread很好的解决了主线程中UI堵塞的问题,有些开发者不清楚,会在子线程刷新界面,代码则会报错。

更多相关文章

  1. Android 单线程模型详解及实例
  2. Android–多线程之Handler下载图片源码
  3. android基础知识02——线程安全3:Message,MessageQueue,Handler,Loop
  4. android之后台线程(UI与线程交互)
  5. Android线程模型(Painless Threading)
  6. Android安卓系统提示应用程序未安装的解决方法
  7. 【移动开发】Android应用程序完全退出

随机推荐

  1. MySQL 5.7解压版安装、卸载及乱码问题的
  2. MySql带OR关键字的多条件查询语句
  3. Centos7使用yum安装MySQL及实现远程连接
  4. Mysql带And关键字的多条件查询语句
  5. Mysql 远程连接配置实现的两种方法
  6. MySQL 获得当前日期时间 函数
  7. Windows 10 与 MySQL 5.5 安装使用及免安
  8. Mysql 切换数据存储目录的实现方法
  9. mysql 5.7版本修改密码的简单方法
  10. Win7x64下Mysql5.7.18解压版的安装方法