zoukankan      html  css  js  c++  java
  • Handler的一个图片轮播程序

    1 Handler是什么?
    * Handler:用来更新UI(主线程)的一套机制,也是一套消息处理机制,我们可以发送信息,也可以通过它来处理消息。
    * 比如最常见的Activity的生命周期:它的回调方法都是通过Handler机制去发送消息的,根据不同的Message来做相应的分支处理。
    2 为什么要使用Handler?
    * 因为android在设计的时候就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制就没有办法来跟新UI的信息,就会抛出异常。(不能在一个非UI线程中跟新UI)。
    * 一个Handler实例其实绑定了一个关联的thread线程和这个线程的message queue;handler会将message和runnable对象发送到它所关联的message queue中去, 同时它也会执行从message queue中出来的message和runnable。
    * 3 handler的四种使用的方法:
    * sendMessage
    * sendMessageDelayed
    * post(Runnable)
    * postDelayed(Runnable,long)
    *


    图片轮播
    MainActivity.class

    public class MainActivity extends AppCompatActivity {
        private ImageView imageView;
        private Handler handler = new Handler();
        private int Images[] = {R.drawable.imga, R.drawable.imgb, R.drawable.imgc};
        private int index;//索引,指示照片的位置
        private MyRunnable myRunnable = new MyRunnable();//创建一个Runnable对象
    
        /**
         * 创建一个Runnable
         */
        class MyRunnable implements Runnable {
    
            @Override
            public void run() {
                index++;
                index = index % 3;
                imageView.setImageResource(Images[index]);//让ImageView设置轮播的图片
                handler.postDelayed(myRunnable, 1000);//每隔1秒去执行myRunnable方法,不断轮播图片,第一个参数是要执行的Runnable对象
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageView = (ImageView) findViewById(R.id.iv_picture);
            handler.postDelayed(myRunnable, 1000);
        }
    }

    4 sendMessage方法

     //需要Handler的Message方法
      private Handler handler = new Handler() { //重写HandleMessage来接收消息,怎么发送一个消息?要在Created方法里面new 出一个线程在里面发送消息
       @Override
       public void handleMessage(Message msg) {
       textView.setText(" " + msg.arg1+ " --- "+msg.arg2);//更新TextView里面的文字
            super.handleMessage(msg);
            }
        };

    在onCreate方法里面创建一个线程:

       new Thread() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                        //要发送消息,那就要先创建一个Message
                        Message message = new Message();
                        message.arg1 =88;
                         message.arg2 =888;
                        handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    super.run();
                }
            }.start();//不要忘记调用start方法,否者线程里面的run方法不会执行

    调用Message的obj方法来发送比较多的数据,来发送Message的数据载体:
    现在内部创建一个Person类:

     //创建一个Person类
        class Person {
            public int age;
            public String name;
    
            //调用toString方法输出name 和age
            @Override
            public String toString() {
                return "name=" + name + "age=" + age;
            }
        }

    然后在线程里面new一个Person对象:

     new Thread() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                        //要发送消息,那就要先创建一个Message
                        Message message = new Message();
                        Person person = new Person();
                        person.age = 22;
                        person.name = "xiaoxjxoaxm";
                        message.obj = person;//调用Message的obi方法来接收person的信息
                        handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    super.run();
                }
            }.start();

    更新TextView里面的数据:

     private Handler handler = new Handler() {
            //重写HandleMessage来接收消息,怎么发送一个消息?要在Created方法里面new 出一个线程在里面发送消息
            @Override
            public void handleMessage(Message msg) {
                textView.setText(" " + msg.obj);//更新TextView里面的文字
                super.handleMessage(msg);
            }
        };

    有时候不要创建一个Message对象,直接调用系统的Message的obtainMessage()方法

     new Thread() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
            //有时候不必创建一个Message对象,而是调用系统的Message对象
             Message message=handler.obtainMessage();//获取Message对象
                        Person person = new Person();
                        person.age = 22;
                        person.name = "xiaoxjxoaxm";
     message.obj = person;//调用Message的obi方法来接收person的信息
     handler.sendMessage(message);//调用Handler的sendMessage方法来发送消息给handleMessage来处理消息
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    super.run();
                }
            }.start();

    有时候不调用 handler.sendMessage(message)来发送消息,还可以调用 message.sendToTarget()来发送消息。target就是一个Handler,它其实就是调用sendMessage来发送消息。

    handler.removeCallbacks();//里面传入一个Runnable对象,来移除消息

    new Handler(Callback )的时候里面的那个回调方法的作用就是,方便handler内部信息的拦截(当这个消息符合我们的拦截的对象),当callback的handlerMessage方法的返回值为true的时候,handler本身的那个handlerMessage方法将得不到回调的信息,所以第二个handlerMessage方法并不会执行。如果那个返回值为false的话,第二个方法就会得到执行。

      private Handler handler=new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Toast.makeText(getApplicationContext(),""+2,Toast.LENGTH_SHORT).show();
                return false;
            }
        }){
            @Override
            public void handleMessage(Message msg) {
                Toast.makeText(getApplicationContext(),""+1,Toast.LENGTH_SHORT).show();
            }
        };

  • 相关阅读:
    保证在浏览器上word/图片/Excel的下载的表现形式一样
    C学习笔记 知识集锦(二)
    函数返回值
    C++ 四种新式类型转换
    构造&析构
    指针与引用
    C++三大特性 封装 继承 多态
    Git stash 常见用法
    Git branch && Git checkout常见用法
    linux Vi使用
  • 原文地址:https://www.cnblogs.com/linewman/p/9918401.html
Copyright © 2011-2022 走看看