android中的Handler的简单初试

来源:互联网 发布:数据库管理员工资待遇 编辑:程序博客网 时间:2024/04/29 16:03

     首先我们要明白在我们进行手机开发的过程中用很多功能他是不能放在Activity的正常的操作里面来处理的,比如说放在onCreate或者放在onStart这样的方法里面,为什么?因为这样的操作相对来讲费时比较长,比如说我们现在要从网络上下载一个文件,这个下载的过程可能会比较长,那么在下载的过程当中,如果我们把这个功能直接把他写在Activity里面,也就是说作为Activity方法的一部分写进去,那么就有可能导致我们在下载的过程当中整个Activity是没有响应的,这样就造成一个比较差的用户体验;另外就是,如果长时间下载不下来的话,那么这Activity也会报错。所以呢,我们就希望把下载啊,或者处理大量数据的这个功能放在单独的一个线程里面来完成。这样Activity是一个线程,而下载文件就是另外一个线程,这个时候在另外一个线程中运行的下载文件这个功能,并不影响我们当前的Activity的正常使用,这样就会让用户感觉好一点。

        那么这个HANDLER的设计,就是专门为我们实现类似于这样的需求,举个例子:

 

public class HandlerTestActivity extends Activity {

    //声明控件变量

    private  Button startButton;

    private  Button endButton;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //根据ID找到开始按钮,并为按钮注册单击事件处理程序

        startButton=(Button)findViewById(R.id.startbutton);

        startButton.setOnClickListener(new View.OnClickListener() {

          

           public void onClick(View v) {

              // TODO Auto-generated method stub

              handlerTest.post(runnableTest);    //line  1

           }

       });

           //根据ID找到结束按钮,并为按钮注册单击事件处理程序

        endButton=(Button)findViewById(R.id.endbutton);

        endButton.setOnClickListener(new View.OnClickListener() {

          

           public void onClick(View v) {

              // TODO Auto-generated method stub

              handlerTest.removeCallbacks(runnableTest);   //line 2

 

           }

       });

    }

    //创建Handler对象

    Handler  handlerTest=new Handler();   //line  3

 

    //使用匿名内部类创建线程

    Runnable  runnableTest=new Runnable(){   //line  4

 

    public void run(){

        System.out.println("wo  shi cai niao");

        handlerTest.postDelayed(runnableTest, 5000);   //line 5

 

    }

    };

}

 

    我们来看一下上面的程序,首先我定义了两个按钮变量,接着用findViewById方法找到这两个按钮,并给这两个按钮注册了单击事件处理程序,我在单击事件的处理程序中分别调用了Handler对象的postremoveCallbacks方法代码的line  1line  2就是了.接下来我们new了一个Handler类的对象, Handler它是android这个操作系统所提供的一个类代码line 3。然后我还声明了一个线程类代码line 4。如果我们对java有一些了解的话,我们就知道java里面实现线程的话通常有两种方式,一是继承Thread,另一个就是实现Runnable 接口。我在这里使用了一个匿名内部类的方式实现了Runnable接口,然后实现他的run方法。我在这个run方法中做了两件事,一是向控制台输出“我是菜鸟”,二是调用Handler对象的postDelayed方法代码line  5

    我们主要来看一下这个postDelayed方法,这个方法有两个参数第一个参数Runnable r 的一个对象,第二个参数long   delayMillis是一个长整型的延迟毫秒数。postDelayed方法是采用了队列的数据结构,我们知道队列是一个先进先出的数据结构,与队列相对的就是栈这中数据结构栈是后进先出的。那么这个是干什么的呢?他是将线程对象延迟多少毫秒放入队列中去。这时你是不是就知道该方法的两参数的意义了吧。

这时这个线程对象已经在队列当中了,当这个线程对象被去出之后,就会被执行,也就是调用run方法。

这里要注意线程对象被加入到队列之后,并不是马上会被执行的,可能我们的队列中有很多线程对象,我们要等到前面的对象都执行完了之后轮到你的线程对象时候才执行。每一个Handler他都有一个与之关联的队列,我们的代码中就只有一个队列。当我们的线程被执行的时候先输出“我是菜鸟”,接着隔5秒钟把线程对象放入队列中。此时大家会有一个疑问,你是这个线程被执行的时候才向队列中放入线程对象的,那么你最开始的线程是怎么执行的呢?

这请看我的line  1的代码,当我们点击开始按钮之后就开始执行line  1的代码,我调用了Handlerpost方法。我们来看一下post方法,他有一个参数Runnable r 的一个对象。Post方法就是将线程对象加入到队列当中去,注意这个方法并没有那个毫秒数的参数啦。所以,当我点击开始按钮之后马上就将线程对象加入队列,之后就会执行下面的线程,也就是调用run方法,接着就是输出“我是菜鸟”,之后隔5秒再次将线程对象加入到队列中去,然后执行线程,然后再隔5秒在加入在执行。我们在结束按钮中调用了HandlerremoveCallbacks方法代码line  2,这个方法就是不再把线程对象加入到队列当中去。

   上面的代码的执行结果就是,当我们点击开始按钮之后首先想控制台输出“我是菜鸟”,接着每隔5秒钟向控制台输出“我是菜鸟”,当我们点击结束按钮后便不会向控制台输出“我是菜鸟”了。

   这就是一个最简单的Handler的使用了。

原创粉丝点击