zoukankan      html  css  js  c++  java
  • Handler的简单使用介绍

          Handler在android程序开发中使用的非常频繁、我们知道android是不允许在子线程中更新UI的,这就需要借助Handler来实现,那么你是否想过为什么一定要这个这样子做呢?而且Handler的内部消息处理机制究竟是什么样的呢,我们了解了之后还可以做点什么事?带着这些疑问我系统的学习了一个讲解Handler原理的课程,今天就在这里将自己的学习收获总结下来。毕竟好记性不如烂笔头,想学会跑就必须先学会好好走路。在总结的时候确实很头疼,因为Handler的原理是需要通过源代码才能说的清楚的,而且它处理机制比较复杂,一时不知道该从哪里说起。想来想去,就先从Handler的几个简单的使用方法开始吧,而且在总结过程中为了方便以后快捷的查阅使用,尽量说的精炼,不牵涉到源码的追踪和解析。

    一、Handler是什么

         Handler是android.os包下的一个消息处理的类。

          自己写代码的时候也将经常使用到Handler,但是对于Handler究竟是什么,还真说不出个所以然。Handler到底是什么呢?如下:

    Handler是android为我们封装的一套消息处理的机制,也是一套子线程用来更新UI的机制

         因此,可以知道,Handler可以做两件事,第一可以在子线程中更新UI,第二可以用来处理消息。下面我们就利用Handler的API,举一个简单的小例子,来看一看Handler是怎么处理消息和更新UI的。

    二、Handler使用的l一个小例子以及相应的方法总结

         (1)模拟图片轮播效果

       大家在点击淘宝的时候肯定遇到过淘宝为你推荐商品的情况,而且推荐的图片会快速的一张接一张的不断的更换。现在我们就用Handeler中的postDelayed方法来简单模拟这样子的一个图片轮播的效果。大家可以翻看源码的注释,这个方法是用来延迟发送一个Runnable实例的,也就是延迟执行该Runnable里的run方法。

       首先你要准备三张图片(请读者自行准备),然后新建项目“HandlerTest”,在其activity_main.xml中写入如下代码:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     >
     6 
     7    <ImageView 
     8        android:id="@+id/imgview"
     9        android:layout_width="wrap_content"
    10        android:layout_height="wrap_content"
    11        android:src="@drawable/ali"/>
    12 
    13 </LinearLayout>

          代码很简单,就是放置了一个ImageView用来显示图片而已。然后在MainActivity中写入下面的代码:

     1 package com.example.handldertest;
     2 
     3 import android.os.Bundle;
     4 import android.os.Handler;
     5 import android.widget.ImageView;
     6 import android.app.Activity;
     7 
     8 
     9 public class MainActivity extends Activity {
    10     
    11     private ImageView img;
    12     //实例化图片数组,存放的是他们的id
    13     private int[] imgs = {R.drawable.ali,R.drawable.girl,R.drawable.q};
    14     private int index = 0;
    15 
    16     private Handler mHandler = new Handler();
    17     private MyRunnable mr = new MyRunnable();
    18     
    19     class MyRunnable implements Runnable{
    20 
    21         public void run() {
    22           index++;
    23           index = index%3;
    24           
    25           img.setImageResource(imgs[index]);
    26           
    27           mHandler.postDelayed(mr, 1000);
    28             
    29         }
    30 
    31     }
    32     
    33     protected void onCreate(Bundle savedInstanceState) {
    34         super.onCreate(savedInstanceState);
    35         setContentView(R.layout.activity_main);
    36         img = (ImageView) findViewById(R.id.imgview);
    37         
    38         mHandler.postDelayed(mr, 1000);
    39     }
    40    
    41 }

         然后我们是怎么首先图片轮播的呢?其实很简单,我们在主线程中postDelayed一个mr对象,然后再在mr对象的run方法中,然它将自己再postDelayed,这样子它就无限循环下去了。那么run方法也就无限循环了,我们只要在run方法中执行ImageView的图片显示逻辑即可。运行程序,效果如下图:

    (2)Handler常用的一个方法小结

         相信这些方法大家都不会感到陌生,在Handler的API中都是可以查阅到的。现小结如下:

    postDelayed(Runnable r, long delayMillis)    延迟多少秒后直接会执行Runnable里的run方法
    sendEmptyMessage(int what) 直接发送一个只包含what字段的消息
    sendMessage(Message msg) 发送一个Message对象
    removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象
    removeMessages(int what) 从Handler中移除一个what字段的消息

          上面的方法的使用应该是很熟悉的了,因为经常用到,就不多举例子了,更多的方法可以查找API文档。把重点放在Handler的消息处理机制的总结上。这是下一篇文章所要做的内容。

  • 相关阅读:
    游标+递归 查询 客户 子客户 查询财务信用
    导入EXCEL
    ftp读取txt数据并插入数据库
    查询通话时间报表
    4.10上午
    4.7下午
    4.6下午
    4.6上午
    4.5上午
    4.1下午
  • 原文地址:https://www.cnblogs.com/fuly550871915/p/4889428.html
Copyright © 2011-2022 走看看