消息机制与任务机制实战(一):Handler

效果展示

这是一个简单的demo,先来看效果:
消息机制与任务机制实战(一):Handler
这是一个类似于计时器的简单实例,用Handler和Message来实现。

实现该操作的主要步骤

1.创建Hander对象,重写其中的HandleMessage()方法。
2.在主/分线程中创建Message(这个demo没有用到线程),且没有创建Message对象,所以在第三步发送Message时用的sendEmptyMessage方法。
3.使用Handler对象发送Message。
4.在handleMessage中处理消息。

代码部分

xml部分

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="40dp"
        android:textColor="#ffda"
        android:layout_gravity="center_horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自动增加"/>
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自动减少"/>
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="暂停"
        android:enabled="false"/>

</LinearLayout>

这部分没什么好说的,唯一重要点的是控件的一个属性enable,可以设置该控件可不可用,这个属性帮助我们锁住某一个控件,比如我在自动增加的时候不能再点以下自动增加,不然就会同时执行两次增加(双倍的快乐…)
java部分

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public final static String TAG = MainActivity.class.getSimpleName();
    private static final int WHAT_INCREATE = 1;
    private static final int WHAT_DECREATE = 2;
    private Button btn_increase;
    private Button btn_decrease;
    private Button btn_pause;
    private TextView textView;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int number = Integer.parseInt(textView.getText().toString());
            switch (msg.what){
                case WHAT_INCREATE:
                    if(number==10){
                    return;
                    }
                    number++;
                    textView.setText(number+"");
                    handler.sendEmptyMessageDelayed(WHAT_INCREATE,1000);//形成循环,持续发消息

                    break;
                case WHAT_DECREATE:
                    if(number==0){
                        return;
                    }
                    number--;
                    textView.setText(number+"");
                    handler.sendEmptyMessageDelayed(WHAT_DECREATE,1000);
                    break;
                default:break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        setOnclickListener();
    }
    private void init(){
        btn_increase = (Button)findViewById(R.id.button1);
        btn_decrease = (Button)findViewById(R.id.button2);
        btn_pause = (Button)findViewById(R.id.button3);
        textView = (TextView)findViewById(R.id.tv);
    }

    @Override
    public void onClick(View v) {
        Log.e(TAG,"onClick");
            if(v==btn_increase){
                //更改按钮的可操作性
                btn_increase.setEnabled(false);
                btn_decrease.setEnabled(true);
                btn_pause.setEnabled(true);
                //移除未处理的执行减少命令的消息
                handler.removeMessages(WHAT_DECREATE);
                //发消息
                handler.sendEmptyMessage(WHAT_INCREATE);
            }
            else if(v==btn_decrease){
                btn_increase.setEnabled(true);
                btn_decrease.setEnabled(false);
                btn_pause.setEnabled(true);
                //移除未处理的执行减少命令的消息
                handler.removeMessages(WHAT_INCREATE);
                //发消息
                handler.sendEmptyMessage(WHAT_DECREATE);
            }
            else if(v==btn_pause){
                btn_increase.setEnabled(true);
                btn_decrease.setEnabled(true);
                btn_pause.setEnabled(false);
                handler.removeMessages(WHAT_INCREATE);
                handler.removeMessages(WHAT_DECREATE);
            }
    }
    public void setOnclickListener(){
        btn_increase.setOnClickListener(this);
        btn_decrease.setOnClickListener(this);
        btn_pause.setOnClickListener(this);
    }
}

1.首先是实例化,监听。关于监听有好几种方法可以实现,我习惯的方法是用接口OnclickListener重载里面的onClick方法。
2.在控件的监听里面,点击到一个按钮后,首先我把这个按钮设为不可用,其余设为可用。
3.在增加按钮和减少按钮中,都用了removeMessages和sendEmptyMessage,可以理解为:当我点增加按钮的时候,我要先结束未完成的执行减少的信息,不然会造成一边增一边减少,同理减少南牛也是这样,暂停按钮则是把增和减的信息都移除,确保数字不会再变化。
4.实例化Handler的时候,重载了handleMessage方法,里面就是message要处理的操作(增加或减少1),它会接受handler对象send的值,可以根据这个值来确定进行什么操作(sendEmptyMessage要送出一个常量,所以我定义了两个静态常量)。

这只是一个关于handler最简单的例子,后面复杂的实例我会慢慢更新…