Android :一段代码理解Handler的工作机制

泡在网上的日子 / 文 发表于2012-10-30 23:02 次阅读 Handler,android

如下的代码实现一个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(); 
        } 
    } 
  
}

 

收藏 赞 (0) 踩 (0)
上一篇:防止android应用的内存泄露
android应用一般——至少在T-Mobile G1上面——被限制在16M的堆内存上运行。它对于一部手机来说可能已经绰绰有余了,但同时对一些开发者来说却是不够的。尽管你没有打算用掉这全部的内存,但是还是要考虑要让你自己的应用占用尽量少的内存,从而让其它和你的
下一篇:Android自定义的Spinner
有一个关于Spinner扩展的问题,问题是,怎么把弹出来的菜单自定义。当然,书上是没有告诉你的,它们压根就不知道那个和ArrayAdapter相关的两个layout关联到底是什么回事说清楚,就这么列了个代码就算了。 而自定义Spinner则是和这两个layout有关,ArrayAdapt