异步消息处理
android耗时操作只能放在非主线程,message从子线程进入主线程,从不能更新UI到更新UI,实现了异步消息处理
- 在主线程中新建一个handler对象,重写handlerMessage()方法
- 子线程需要UI操作,新建一个Message对象,设置message.what指明是哪一个线程,再设定
- 传递整形数据 message.arg1 message.arg2
- 传递对象数据 message.obj
- 传递<font color=#EE3A8C>bundle</font>数据
- hanler.sendMessage()发送消息
- 发送后消息添加到MessageQueue的队列当中等待,再调用Looper.loop()方法循环取出返回到handler的handleMessage()方法中,Handler在主线程创建,handleMessage()也在主线程中执行实现了更新UI。
handler post方法
private Handler handler=new Handler();
new Thread(){ public void run(){ try{ handler.post(runnable(){ UI操作 }); // handler.postDalyed(myRunnable,1000) 每隔一秒执行runnable对象 } } }
SendMessage方法
private Handler handler=new Handler(){ public void handlerMessage(Message msg){ switch(msg.what){ case 1: //进行UI操作 text.setText(); break; default: break; } } }
服务器去到大量数据 使用JSON、Message.obj
其实是可以获取这里自己创建
1.Class Person{ public int age; public String name; public String toString(){ return "name="+name+",age="+age; } }
2.` new Thread(){
public void run(){
try{
Thread.sleep(2000);
Message message=new Message();
Person person=new Person;
person.name="dota"
person.age=23
message.obj=person;
}catch(e.){
}
}
}`
- handleMessage中
text.setText(msg.obj);
Bundle数据
Message message=new Message(); Bundle bundle=new Bundle(); bundle.putString("time","时间");//key value bundle.putInt("age",23); message.setData(bundle); message.what=1; handler.sendMessage(message);
handleMessage()再调用 msg.getData.getStrig("time"); msg.getData.getInt("age");
Asynctask使用
- 子线程更新UI
- 封装简化了异步操作
Asynctask是一个抽象类,通常用子类继承,子类中需要制定三个泛型参数。
- Params:启动任务时输入参数的类型。
- Progress: 后台执行任务返回进度值的类型。
- Result: 任务执行完成后需要返回值的类型。
Asynctask子类的回调方法
- doInBackground(): 必须重写,异步执行后台线程将要完成的任务
-
OnPreExecute(): 执行后台超时操作前被调用,通常完成用户初始化操作。
*** OnPostExecute()**: 在doInBackground执行后被调用,并将doInBackground()方法返回的值传给该方法。 - OnProgressUpdate(): 在doInBackground()中执行publishProgress()方法更新任务进度后,就会执行该方法。
- MyAsynctask extends Asynctask<void,integer,boolean>
overide四个方法
- onCreate方法中
MyAsynctask task=new MyAsynctask();
task.exexute();
String... params表示可变长的数组,可以传递不同的参数,依次传入paras[]数组
protected Bitmap doInBackground(String... params) { return null; }
Asynctask是基于线程池的,必须要等前面一个线程执行结束才能进入下个一线程操作,比如上一个Progressbar没有执行到100,退出在进入时进度条是不变的。
此时可以使用 Astnctask的生命周期与Activity的生命周期保持一致
protected void onPause() { super.onPause(); //不为空或者running if(task!=null&&task.getStatus()==AsyncTask.Status.RUNNING){ //cancle方法只是将asynctask标记为cancle状态 并不是真正的取消执行 task.cancel(true); } }
doInBackground中
if(isCancled()){
break;
}OnProgressUpdate()中
if(isCancled()){
return;
}