Chinaunix首页 | 论坛 | 博客
  • 博客访问: 134803
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-12 16:52
文章分类

全部博文(34)

文章存档

2015年(13)

2014年(21)

我的朋友

分类: Android平台

2015-03-24 16:30:38

Handler的作用一般是子线程向主线程中传递消息,用来主线程处理和UI相关的东西。为什么要在子线程中用呢,因为如果主线程处理了过多耗时的东西,可能会导致假死,所以一般都放到子线程中去处理耗时的东西。

先看下上面的界面。就是这样子,模拟一个耗时操作,然后下载完成后关闭对话框。

看下主Activity:


[java] view plaincopy
  1. package com.howlaa.lesson27_handler;  
  2.   
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.app.Activity;  
  7. import android.app.ProgressDialog;  
  8. import android.content.res.Resources;  
  9. import android.util.Log;  
  10. import android.view.Menu;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13.   
  14. public class MainHandler extends Activity {  
  15.       
  16.      //声明变量  
  17.     private Button b1;  
  18.     private ProgressDialog pd;  
  19.       
  20.     //定义Handler对象  
  21.     private Handler handler =new Handler(){  
  22.             @Override  
  23.             //当有消息发送出来的时候就执行Handler的这个方法  
  24.             public void handleMessage(Message msg){  
  25.                     super.handleMessage(msg);  
  26.                     //只要执行到这里就关闭对话框  
  27.                     pd.dismiss();  
  28.             }  
  29.     };  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main_handler);  
  35.         Resources res=  this.getResources();  
  36.         //查看UI组件所在的线程名  
  37.         Log.i("tag""onCreate()-->"+Thread.currentThread().getName());  
  38.         //定义UI组件  
  39.         b1= (Button)findViewById(R.id.Button01);  
  40.         //给按钮绑定单击事件监听器  
  41.         b1.setOnClickListener(new View.OnClickListener() {  
  42.   
  43.                         @Override  
  44.                         public void onClick(View v) {  
  45.                                 //点击按钮后去处理长耗时操作  
  46.                                 processThread();  
  47.                         }  
  48.        });  
  49.     }  
  50.       
  51.     private void processThread(){  
  52.          //构建一个下载进度条  
  53.         pd= ProgressDialog.show(MainHandler.this"下载文件""正在下载……");  
  54.         Log.i("tag""processThread()-->"+Thread.currentThread().getName());  
  55.           
  56.         new Thread(){  
  57.             @Override  
  58.             public void run(){  
  59.                     Log.i("tag""run()-->"+Thread.currentThread().getName());  
  60.                     //在新线程里执行长耗时方法  
  61.                     longTimeMethod();  
  62.                     //执行完毕后给handler发送一个空消息  
  63.                     handler.sendEmptyMessage(0);  
  64.             }  
  65.   
  66.         }.start();  
  67.     }  
  68.       
  69.     //模拟下载文件的长耗时方法  
  70.     private void longTimeMethod(){  
  71.         try {  
  72.                 Log.i("tag""longTimeMethod-->"+Thread.currentThread().getName());  
  73.                     Thread.sleep(10000);  
  74.             } catch (InterruptedException e) {  
  75.                     e.printStackTrace();  
  76.             }  
  77.     }  
  78.       
  79.       
  80.   
  81. }  
layout界面就不需要贴啦。
阅读(831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~