• android内部通信handler


    什么是handler?

    handler主要用在用户同自己创建的线程进行通信,andorid应用程序在主线程中会维护一个消息队列,通过Message对象在线程间进行通信.在handler内部的handlerMessage中处理消息请求

    其实学习过VC++的朋友应该可以很好的理解handler,类似于VC++中的消息处理

    Message对象都都存储了什么?

    一共有4个参数,arg1,arg2,obj,what

    arg1和arg2 是int类型,可以通过成员方法setData和getData访问进行修改

    obj ,object类型,可以存储任意类型,比如放一个对象,一个int值,也就是消息中的附加数据

    what,int类型,就是用户定义的消息类型码,可以通过what判断是什么消息

    我们来做个例子,这个例子有一个TextView显示进度和完成及停止的内容,一个ProgressBar来显示进度,两个Button,用于开始和停止

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.ssln.handler.MainActivity" >
    
        <TextView
            android:id="@+id/tvMsg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
    
        <ProgressBar
            android:id="@+id/progbar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <Button
                android:id="@+id/btnstart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="开始" />
    
            <Button
                android:id="@+id/btnstop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="停止" />
    
        </LinearLayout>
    
    </LinearLayout>

    MainActivity.java

    package com.ssln.handler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        private final int UPDATEMSG = 1; // 更新消息类型
        private final int COMPLETEMSG=2; // 完成消息
        private final int STOPMSG=3;     // 停止消息
        private final int MAXVALUE = 100; // ProgressBar最大值
        
        private boolean isStop=false;     //是否停止
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final TextView tvMsg = (TextView) findViewById(R.id.tvMsg);
            final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progbar);
            Button btnstart = (Button) findViewById(R.id.btnstart);
            Button btnstop=(Button)findViewById(R.id.btnstop);
    
            // 设置最大值
            progressBar.setMax(MAXVALUE);
    
            // 初始化一个handler,用于更新textview和progressBar
            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                     switch(msg.what)
                     {
                     case UPDATEMSG:
                        tvMsg.setText(msg.obj.toString() + "%");
                        progressBar
                                .setProgress(Integer.valueOf(msg.obj.toString()));
                        break;
                     case COMPLETEMSG:
                         tvMsg.setText("完成了更新操作");
                         break;
                     case STOPMSG:
                         tvMsg.setText("停止了更新操作");
                         break;
                     }
                 
                }
            };
    
            //停止操作
            btnstop.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                     isStop=true;
                }
            });
            
            //开始 使用BUTTON来创建一个新线程,来更新数据
            btnstart.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Thread() {
                        public void run() {
                            Message msg;
                            for (int i = 0; i < MAXVALUE; i++) {
                                if(isStop)
                                {
                                    break;
                                }
                                // 循环发送消息,实现内部通信
                                msg = new Message();
                                msg.what = UPDATEMSG;
                                msg.obj = i + 1;
                                handler.sendMessage(msg);
                                try {
                                    // 睡眠一段时间
                                    Thread.sleep(150);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            if(!isStop)
                            {
                                //发送完成消息
                                msg = new Message();
                                msg.what =COMPLETEMSG ;
                                handler.sendMessage(msg);
                            }
                            else
                            {
                                //发送停止消息
                                msg = new Message();
                                msg.what =STOPMSG ;
                                handler.sendMessage(msg);
                                isStop=false;
                            }
                            
                        }
    
                    }.start();
                }
            });
        }
    
    }

    当点击开始按钮后,每间隔150毫秒,会发送一个updatemsg,其中的obj为当前的进度值,进度条设置进度为obj,textview会显示百分比



    当进度到达100%的时候,会发送一个COMPLETEMSG 完成消息,用于TextView更新显示



    如果在更新过程中,点击了停止,那开始的线程中就会跳出循环,并发送一个 STOPMSG 停止消息


  • 相关阅读:
    Docker 笔记
    Win10 Docker 安装使用
    golang struct转map
    Golang 中错误与异常需要重新认识
    Golang 中三种读取文件发放性能对比
    GoLang中如何使用多参数属性传参
    GoLang中flag标签使用
    Windows本地搭建Edusoho环境
    edusoho上传视频弹出abort之解决方案
    XAMPP启动mysql遇到的问题
  • 原文地址:https://www.cnblogs.com/alwaysfirst/p/4006838.html
Copyright © 2020-2023  润新知