Android使用异步的误区(关于Handler.post的操作方式)
2014-09-29 14:17
337 查看
一.遇到的状况
有这样一个问题值得我们思考,若把一些通讯的(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "Thread signal is 478921")。因此,我们需要把这些耗时的操作放在单独的子线程中操作。这就是Handler的使命。Handler提供异步处理的功能,发送和接收不是同时的(Activity的主线程和线程队列里的线程是不同的线程,并行进行,互不影响)。然而,当我们使用了Thread和Handler的处理方式的时候如:
AHandler ahandler = new Handler();
AThread aThread=new Thread(handler);
在aThread的方法体里,我们实现的是:
private class AThread extends Thread{
private AHandler handler;
public AThread (AHandler handler){
this.handler = handler;
}
public void run(){
super.run();
//执行通讯
//数据完成后,通知handler更新UI。
handler.sendMessage(msg);
}
}
在java中,线程的创建有两种方法:继承Thread类和实现Runnable接口。而这最重要的都是要复写run方法来实现线程的功能。当线程的时间片到了,开始运行时,就执行run()函数,执行完毕,就进入死亡状态。然而,按照这种方式的作用下,当线程执行通讯时发生阻塞,比如(死链)的时候,这时候,该线程被堵塞,报 "Thread
signal is 478921",发生ANR异常退出。因此,从这种状况下来说,似乎是没有异步的。
二.Handler的作用
1.安排消息或Runnable 在某个主线程中某个地方执行。2.安排一个动作在另外的线程中执行。
三.handler.post()的测试:
Runnable thread=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("HandlerThread:"+Thread.currentThread().getId());
}
这个程序看上去似乎实现了Handler的异步机制,
handler.post(thread)似乎实现了新启线程的作用,不过通过执行我们发现,两个线程的ID相同!也就是说,实际上thread还是原来 的主线程,由此可见,handler.post()方法并未真正新建线程,只是在原线程上执行而已,我们并未实现异步机制。
因此真正的异步应该为:
定义一个线程。 class MyThread extends Thread{ Handler mHandler; Boolean boo; public MyThread(Handler handler){ mHandler = handler; } public void setBoo(boolean b) {boo = b; } publid void run(){ if(boo){ getWeatherInfo();//耗时操作 analyzing();//耗时操作 mHandler.post(new Runnable() { public void run() { setWeather();//更新UI } );//更新UI boo = true; } } }
防止发生使用Handler误区,官方建议使用AsynTask的机制。AsynTask是一个轻量级的异步处理类,他是基于Handler和Thread的处理上进行封装,真正实现了异步操作。
相关文章推荐
- Android异步更新UI的方式之使用Handler的post(Runnabel r)方法
- Android异步更新UI的方式之使用Handler消息传递机制
- Android中使用Handler和AsyncTask进行异步操作
- Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作
- 【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目
- 对于Android中Thread异步操作中post方法内使用Toast
- 关于 Android 中使用get和post方式的区别与优缺点
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作
- Handler原理与使用,以及Android中异步更新的UI的方式
- 使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据
- android之使用get和post方式向服务器提交请求
- 关于android图片的传输,android图片传输方式,xml传输图片,android 使用base64编码图片使用xml传输图片
- 在Android使用 SAX 方式进行异步解析
- Android 两种异步操作方式
- 关于Lucene的详细说明和操作使用方式
- Android中使用Handler和Thread线程执行后台操作
- android中的handler是异步操作(测试后的结论)
- Jersey使用总结一(jersey初步使用和简单post请求几种参数传递,String方式,不含对象操作)
- 在Android中使用Handler和Thread线程执行后台操作