最近没事复习了下Android的异步
在子线程中更新ui会出现Only the original thread that created a view hierarchy can touch its views.错误所以要用到异步
1 asynctask是Android提供的一个简单的异步类 使用例子(必须实现doInBackground)
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
//一些耗时的操作
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {//这个参数是doInBackground 返回值
//更新ui
} }2 Thread 创建一个子线程 有两种实现方式
第一种 Thread thread2 = new Thread(){
public void run() {//一些耗时操作 ,不更更新ui
};
};
thread2.start();
第二种
Thread thread = new Thread(new Myrunalbe());
thread.start();
Runable 是个接口需要实现run方法,在run中处理一些耗时操作同样不能更新ui,推荐使用这种,Thread 对象相当于工人,Runalbe对象相当于工人做的任务。
3 想要在线程中更新ui 就得使用 Handler了或者前面说的Asynctask
在主线程中 创建handler
handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
ivImageView.setBackgroundResource(R.drawable.ic_launcher);
break;
default:
break;
}
}
class Myrunalbe implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(2000);//如果不sleep,直接在这里更新ui 大部分情况下是可以更新的,但是非常危险所以还是要使用handler
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
//ivImageView.setBackgroundResource(R.drawable.ic_launcher);
handler.sendEmptyMessage(1);//发送消息 更新ui
}
}