下面我们来做一个例子。分别用handler加thread实现,handler加handlerThread实现,AsyncTask实现。
主要就是一个按钮,一个进度条,点击后,进度条每一秒更新一次。
1:handler加thread实现。
public class HandlerThread extends Activity{ MyHandler handler; MyThread updateThread; ProgressBar pb_test; Button btn_test; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler=new MyHandler(); updateThread=new MyThread(); pb_test=(ProgressBar)findViewById(R.id.pg_bar); btn_test=(Button)findViewById(R.id.btn_test); btn_test.setOnClickListener(new MyListener()); } class MyListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO Auto-generated method stub handler.post(updateThread);//将要执行的线程加入到队列中 } }//处理事件响应的类 class MyHandler extends Handler{ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub pb_test.setProgress(msg.arg1);//更改进度条的状态 }//处理消息队列 } class MyThread implements Runnable{ int i=0; @Override public void run() { // TODO Auto-generated method stub i+=10; System.out.println(Thread.currentThread().getName()); Message msg=handler.obtainMessage(); msg.arg1=i; try{ Thread.sleep(1000);//1秒钟更新一次 }catch(Exception e){ e.printStackTrace(); } handler.sendMessage(msg);//将message添加到消息队列中 handler.post(updateThread);//将线程再次加入到handler队列中,实现循环。 if(i==100){ handler.removeCallbacks(updateThread);//进度条到达100后,将线程移除。 } } } }
上述代码中的红色语句打印了当前线程的名称,结果出来是:main。一开始觉得很惊讶,因为按照我的理解,应该是新开辟一个线程的,结果却不是。这样的处理在log中也会报出“too many work in main thread”的提示。查了资料后才知道,这种handler加thread的方式不默认不开辟新线程的。按照java的语法知识,线程的执行是调用线程的start()方法,这里只是把用post将线程直接加入handler队列中,直接执行线程的run方法,并没有调用start()。所有在上述打印的结果显示的是:main。这种方法真是无聊,搞半天,本来想的是把那些费时的方法移出主线程,结果还是没达到结果。
2:下面介绍第二种方式:HandlerThread 加handler
public class MainActivity extends Activity { Handler handler; HandlerThread handlerThread; MyThread myThread; ProgressBar pg_test; Button btn_test; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pg_test=(ProgressBar)findViewById(R.id.pg_bar); btn_test=(Button)findViewById(R.id.btn_test); myThread=new MyThread(); handlerThread=new HandlerThread("handleThread"); handlerThread.start();//这两句是关键代码 handler=new Handler(handlerThread.getLooper()){//Looper提供了循环从队列中取得消息的功能 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub pg_test.setProgress(msg.arg1); } }; btn_test.setOnClickListener(new BtnListener()); } class BtnListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO Auto-generated method stub handler.post(myThread); } }//处理事件响应的代码 class MyThread implements Runnable{ int i=0; @Override public void run() { // TODO Auto-generated method stub i+=10; System.out.println("Thread name:"+Thread.currentThread().getName()); Message msg=handler.obtainMessage(); msg.arg1=i; try{ Thread.sleep(1000); }catch(Exception e){ System.out.println(e.getMessage()); } msg.sendToTarget();//将消息发送到与之绑定的那个handler中 handler.post(myThread); if(i==100){ handler.removeCallbacks(myThread); } } } }
上述红色的语句都是为了真正实现另起一个线程所不可少的。在这种方式下,蓝色语句打印的结果符合了我们的要求打印的结果:thread name:handleThread.以此证明确实新开了一个线程。这种方式本人还不是很理解,只是找到了一种可行的线程方案。对于android中需要使用异步操作的地方,我一般还是使用第三种方式AsyncTask。
3:使用AsyncTask实现进度条的更新。
AsyncTask是android推荐的进行异步操作的类,使用如下
public class AsyncTaskTest extends Activity{ ProgressBar pb_test; Button btn_test; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pb_test=(ProgressBar)findViewById(R.id.pg_bar); btn_test=(Button)findViewById(R.id.btn_test); btn_test.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub try{ new UpdateProgressAsync().execute("");//启动异步类,执行doInbackground方法 }catch(Exception e){ e.printStackTrace(); } } }); } class UpdateProgressAsync extends AsyncTask<String,Integer,String>{//这三个参数还可以是object @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub int i=0; while(i<=100){ i+=10; try{ Thread.sleep(1000); publishProgress(i);//调用下面的onProgressUpdate方法更新主线程UI }catch(Exception e){ e.printStackTrace(); } } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result);//可以根据doInBackground的返回结果更新主线程UI } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); pb_test.setProgress(values[0]);//获取publishProgress(i)传过来的i值,使用它更新进度条的值。 } } }
使用这种方式将耗时的操作全放在doInbackground中,结果返回,可以通过onPostExecute修改主线程UI。还可以通过onProgressUpdate看进度。完全不会阻塞主线程。参数不仅可以是string类型,还可以是Object。
三个例子所需要的源码可以参考下面链接,运行的时候,需要修改manifest中的程序入口。
http://download.csdn.net/detail/beiweideqidaozhe/7588113
相关推荐
总结一下,`Handler`、`AsyncTask`和`Looper`在Android开发中起到了关键作用,它们帮助我们处理线程间的通信和异步任务。`Handler`用于发送和处理消息,`AsyncTask`简化了后台任务的执行,而`Looper`确保了消息的...
在Android开发中,`Handler`、`Thread`、`AsyncTask`和`HttpURLConnection`是四个非常关键的概念,它们涉及到应用程序的多线程处理、网络通信以及UI更新。接下来,我们将详细探讨这些知识点。 首先,`Thread`是Java...
在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...
本篇文章将详细探讨两种常见的异步处理方式:`AsyncTask`和`Thread`配合`Handler`,并进行对比分析。 `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理机制,它主要用于短时间的后台操作,如网络请求、数据...
实验报告“9Handler&...总结来说,该实验报告旨在通过实际操作让开发者了解和掌握Handler和AsyncTask在Android开发中的应用,提升处理后台任务和更新UI的能力,这对于任何Android开发者来说都是至关重要的技能。
总结,Android的线程+Handler和AsyncTask都可以实现异步下载图片。线程+Handler适合更复杂的线程间通信和控制,而AsyncTask则提供了一个简洁的接口,适用于简单的异步任务。开发者应根据具体项目需求和场景选择合适...
在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...
在Android开发中,`Handler`和`AsyncTask`是两种常用的方式来处理应用程序中的异步操作。它们都是为了在主线程和工作线程之间传递数据、更新UI,避免阻塞主线程,提供良好的用户体验。让我们深入了解一下这两个关键...
"thread-handler-asynctask-demo"这个项目是一个关于Java线程和异步任务处理的示例,主要用于演示如何在Android环境中有效地管理后台任务以避免阻塞主线程。 1. **线程基础** - **线程**:线程是程序执行的最小...
本示例探讨了三种不同的方法——HandlerThread、AsyncTask以及Handler,它们都是用来在后台线程处理耗时操作并更新UI(主线程)的有效手段。下面我们将深入理解这三个概念及其在进度条更新中的应用。 首先,...
AsyncTask是Android提供的一种轻量级的异步任务处理类,适合处理一些短时间的后台任务。它有三个泛型参数,分别代表后台任务的输入参数类型、进度更新的类型和返回结果的类型。在AsyncTask中,`doInBackground()`...
Android的AsyncTask比Handler更轻量级一些 适用于简单的异步处理 首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android...
Android的AsyncTask比Handler更轻量级一些(只是代码上轻量一些,而实际上要比Handler更耗资源),适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新...
Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...
在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html
在Android开发中,`Looper`、`Handler`和`AsyncTask`是三个核心组件,用于实现线程间的通信和异步处理。它们是Android应用程序中处理UI更新和后台任务的关键工具。 首先,让我们深入理解`Looper`。`Looper`是...
AsyncTask和Handler是Android系统提供的两种主要的异步处理机制,它们都可以用来更新UI并实现进度条的动态显示。下面将详细讲解这两种方式的工作原理和应用场景。 **AsyncTask** AsyncTask是一个轻量级的异步任务...
本文将深入探讨Android中的线程模型,重点讲解Handler、Message Queue和AsyncTask,并提供修改Button样式的示例,最终实现一个易用的整合方案。 首先,我们来看Android中的主线程,也称为UI线程。它负责处理用户...