Android :一段代码理解Handler的工作机制
如下的代码实现一个Iphone 上的一个通过按backspace键后,数字过多消除的按钮事件。事件的原理如下,事件要的效果是这样的,当长按消除按钮后,数字会慢慢消除,当消除5个字符后继续消除的话消除速度会增快。通过这份代码可以帮助我们较好的初识Handler的工作机制。
//http://www.jcodecraeer.com
package com.william.handlertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class HandlerTest extends Activity implements Runnable{
private EditText content = null;
private Button backspace = null;
private boolean isStop = false;
private Handler mHandler = null;
private class BackspaceOnTouchListener implements Button.OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
isStop = true;
mHandler = getHandler(content);
new Thread(HandlerTest.this).start();
break;
case MotionEvent.ACTION_UP:
isStop = false;
break;
default:
break;
}
return false;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
content = (EditText) findViewById(R.id.content);
content.setCursorVisible(false);
backspace = (Button) findViewById(R.id.backspace);
backspace.setOnTouchListener(new BackspaceOnTouchListener());
}
private Handler getHandler(final TextView content){
return new Handler(){
@Override
public void handleMessage(Message msg) {
content.setText((String)msg.obj);
super.handleMessage(msg);
}
};
}
@Override
public void run() {
try{
int i = 0;
do{
i++;
Thread.sleep((i > 5 ? 100 : 500));
String contentStr = this.content.getText().toString();
if(contentStr.length()==0){
break;
}
contentStr = contentStr.substring(0, contentStr.length()-1);
Message msg = mHandler.obtainMessage();
msg.obj=contentStr;
msg.sendToTarget();
}while(isStop);
}catch(Exception e){
e.printStackTrace();
}
}
}