最近在做android项目的时候经常要用到比较耗时的操作,一但操作的时间过长,比如超过一分钟那么就会造成UI阻塞,界面假设的状况。那么我们就要用到多线程,其实多线程原理很简单,每个Activity可以算作是一个进程,进程里面有一个主线程在运行,那么我们只需要在主线程中开一个子线程将那些耗时长的操作丢进去就可以了。在这里如果直接在子线程中的操作完成了之后就更新UI,那么就抛出异常,原因在于不能直接在子线程中对主线程UI操作。我们可以操作的是发送一个消息给主线程,让主线程来更新UI。这中间涉及到了一个消息机制,就要用到android自带的Handle机制。下面这个是最简单的例子:
以我们经常接触到的下载为例子,开始的时候用一个用一个textview显示准备下载,下载的时候显示下载中,下载完成之后显示下载完成三种不同状态。
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView) findViewById(R.id.tv);
checkUpdate.start();
textView.setText("准备下载...");
}
//实例化Handler
private Handler mHandler =new Handler() {
//接收子线程发来的消息,同时更新UI
publicvoid handleMessage(Message msg) {
textView.setText("歌词下载完成。");
}
};
//实例化新的线程
private Thread checkUpdate =new Thread() {
@Override
publicvoid run() {
Looper.prepare();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//向主线程发送消息
mHandler.sendMessage(mHandler.obtainMessage());
}
};
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView) findViewById(R.id.tv);
checkUpdate.start();
textView.setText("准备下载...");
}
//实例化Handler
private Handler mHandler =new Handler() {
//接收子线程发来的消息,同时更新UI
publicvoid handleMessage(Message msg) {
textView.setText("歌词下载完成。");
}
};
//实例化新的线程
private Thread checkUpdate =new Thread() {
@Override
publicvoid run() {
Looper.prepare();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//向主线程发送消息
mHandler.sendMessage(mHandler.obtainMessage());
}
};
还要注意的是异步提交的时候开了线程也是无效的。