效果展示
这是一个简单的demo,先来看效果:
这是一个类似于计时器的简单实例,用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最简单的例子,后面复杂的实例我会慢慢更新…