您的位置:首页 > 产品设计 > UI/UE

Android中使用Thread+Handler实现非UI线程更新UI界面

2014-10-23 19:39 573 查看
每个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堵塞的问题,有些开发者不清楚,会在子线程刷新界面,代码则会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐