• 0114 Handler(一)


    如果耗时的线程放在Activity会耗死,如果放在另一个线程里,用户感觉更加好,Handler就是满足此项功能

    把下载或者单独处理数据放在另一个线程里面

    Activity是一个线程,处理数据或者下载文件时另一个线程

    Handler是安卓操作系统所提供的一个类

    线程类

    JAVA实现线程有两种方法

    1,继承thread类

    2,实现Ruanable接口  此处用匿名内部类实现接口 ,里面实现run()方法

    线程有几种状态,就绪,运行,阻塞,死亡

    handler.postDelayed(updateThread,3000)

    隔3000毫秒加入一次updateThread这个线程

    匿名内部类的学习见 android tips 收藏网页

    Handler 存在两个队列

    其中一个是将线程放入的队列,线程队列,比如放入下载线程等比较耗时间的线程

    另一个是将消息放入的队列,消息队列里面放的是Message对象

    Message类是由 Android操作系统提供

    如何得到Message对象?

    Message msg=Handler对象.obtainMessage();

    msg里面有arg1和arg2这个成员变量,是整形

    用他们两个来传递消息,优点是系统系能消耗较少

    比如用户设置某个变量int i=1;

    arg就是用来传递用户定义的值给 Message中使用 msg.arg1这样就能操作消息中的变量

    ------------------------------------------------------------

    Handler对象两个方法调入两个队列,一个是线程队列,另一个是消息队列

    updateHandler.post(updateThread);这个updateThread将会被调入到线程队列中

    updateHandler.sendMessage(msg); msg这个消息对象就会被加入到那个消息队列中

    -----------------------------------------------------------------------

    在调用 updateHandler.sendMessage(msg);时候,消息被压入到消息队列的尾部

    而此消息可以被 handleMessage(Message msg)接受,handleMessage就开始往外面取出消息,取出的消息就是Message对象

    Handler实现有两种

     Handler handler=new Handler();

    或者 在声明对象时候同时实现匿名内部类,里面复写handleMessage方法

    Handler handler=new Handler()

    {

    @override

    public void handleMessage(Message msg)

    {}

    };

    -----------------------------------------------------------------------

    代码是从上往下执行

    在队列的两端

    末端由sendMessage压入消息,消息可以携带很多数据,比如此处携带arg1整形数据

    而头部处理是由handleMessage处理,两者是异步,注意是异步的

    就如同寄信,一个寄信,一个取信

    --------------------------------------------------------------------------

    --------------------------------------------------------------------------

    代码如下

     1 import android.os.Bundle;
     2 import android.os.Handler;
     3 import android.os.Message;
     4 import android.app.Activity;
     5 import android.view.Menu;
     6 import android.view.View;
     7 import android.view.View.OnClickListener;
     8 import android.widget.Button;
     9 import android.widget.ProgressBar;
    10 
    11 public class Activity11 extends Activity {
    12     private Button startButton;
    13     private ProgressBar myProgressBar;
    14     
    15 
    16     @Override
    17     protected void onCreate(Bundle savedInstanceState) {
    18         super.onCreate(savedInstanceState);
    19         setContentView(R.layout.main);
    20         startButton=(Button)findViewById(R.id.startButton);
    21         myProgressBar=(ProgressBar)findViewById(R.id.myProgressBar);
    22         startButton.setOnClickListener(new ButtonListener());
    23         
    24         
    25     }
    26     class ButtonListener implements OnClickListener
    27     {
    28 
    29         @Override
    30         public void onClick(View arg0) {
    31             // TODO Auto-generated method stub
    32             myProgressBar.setVisibility(View.VISIBLE);
    33             handler.post(updateThread);//用handler将某线程压入线程队列
    34             
    35             
    36             
    37         }
    38         
    39     }
    40     Handler handler=new Handler(){
    41         //执行handlerMessage方法将队列另一端取出Message处理
    42         @Override
    43         public void handleMessage(Message msg) {
    44             // TODO Auto-generated method stub
    45             super.handleMessage(msg);
    46             myProgressBar.setProgress(msg.arg1);//处理进度条,此处整形数据是由消息中的arg1传入的
    47             handler.post(updateThread);//继续重复执行压入线程
    48             
    49         }
    50         
    51     };
    52     //用Runnable实现线程,创建Runnable对象,同时复写run()功能
    53     //run()要写出此线程完成的具体功能,列表尾端压入Message对象,头部由handleMessage处理
    54     Runnable updateThread=new Runnable(){
    55         int i=0;//只想updateThread方法时是执行run()方法,当重复使用updateThread时候,一直是该对象,所以i值是该对象全局变量
    56         @Override
    57         public void run() {
    58             // TODO Auto-generated method stub
    59             
    60             i=i+10;
    61             Message msg=handler.obtainMessage();// 获取Message对象由handler调出
    62             msg.arg1=i;//Message对象msg有 arg1和arg2用来传递用户自定义的数据给Message
    63             //handler存在两个队列,一个是线程队列,另一个是消息队列
    64             handler.sendMessage(msg);//对比handler.post(updateThread);此处是压入Message对象到消息队列
    65             //上面压入消息,可以由handleMessage来收取,两者是异步的
    66             try{
    67                 Thread.sleep(1000);
    68             }catch(InterruptedException e){
    69                 e.printStackTrace();
    70             };
    71             
    72             if(i==100)
    73             {
    74                 handler.removeCallbacks(updateThread);//默认是100如果进度条慢,则移除线程
    75             }
    76             
    77         }
    78         
    79     };
    80 
    81     
    82 
    83 }
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6     <ProgressBar
     7         android:id="@+id/myProgressBar"
     8         android:layout_width="fill_parent"
     9         android:layout_height="100sp"
    10         style="?android:attr/progressBarStyleHorizontal"
    11         android:visibility="gone"
    12    
    13         />
    14     <Button 
    15         android:id="@+id/startButton"
    16         android:layout_width="wrap_content"
    17         android:layout_height="wrap_content"
    18         
    19         />
    20 
    21 </LinearLayout>
  • 相关阅读:
    题解 POJ1149 Pigs
    题解 【网络流24题】运输问题
    题解 【网络流24题】太空飞行计划
    题解 【网络流24题】方格取数问题
    题解 密码锁
    题解 【重庆八中模拟赛】寻找代表元
    题解 [SHOI2010]最小生成树
    题解 【ZJOI2009】 假期的宿舍
    题解 [ZJOI2008]树的统计Count
    JSP页面中的pageEncoding和contentType两种属性(转)
  • 原文地址:https://www.cnblogs.com/kyxyes/p/2883651.html
Copyright © 2020-2023  润新知