Android——Handler应用(打地鼠)

先放完成截图:

 实现代码:

完成初始化的一些工作:

private static final int CODE =123;
    public static final int MAX_COUNT=10;
    private static final int RANDOM_NUMBER = 500;
    TextView mResultView;
    ImageView mouseImageView;
    Button startbutton;

    public int [][] mPosition=new int[][]{
            {123,678},{432,880},
            {532,234},{429,244},
            {145,789},{666,777},
            {555,666},{432,880}
    };

    private int mTotalCount;
    private int mSuccessCount;
    private  MouseHandler hander=new MouseHandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       init();
       setTitle("打地鼠");


    }

初始化按钮点击事件,地鼠点击事件和控件:

 private void init()
    {
        mResultView=(TextView)findViewById(R.id.text_view);
        mouseImageView=(ImageView)findViewById(R.id.imageView);
        startbutton=(Button)findViewById(R.id.start_button);

        startbutton.setOnClickListener(this);
        mouseImageView.setOnTouchListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(R.id.start_button){
            case R.id.start_button:
                start();
                break;
        }
    }
  @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setVisibility(View.INVISIBLE);
        mSuccessCount++;
        mResultView.setText("好棒呀,你打到了"+mSuccessCount+"只");
        return false;
    }

start方法:

private void start()
    {
        //发送消息
        mResultView.setText("开始啦");
        startbutton.setText("游戏中");
        startbutton.setEnabled(false);//按钮不能再点击了
        next(0);


    }
    private void next(int delaytime)
    {
        int position=new Random().nextInt(mPosition.length);
        Message message=Message.obtain();
        message.what=CODE;
        message.arg1=position;
        hander.sendMessageDelayed(message,delaytime);
        mTotalCount++;


    }

handler类实现耗时操作:

如果msg的what值为123,开始打地鼠,其中位置是随机生成的。延时的时间也是随机生成的。一直到地鼠出现了10次,恢复变量的方法,跳出handleMessage()方法。

 public class MouseHandler extends Handler{
        private final WeakReference<MainActivity> mWeakReference;

       public MouseHandler(MainActivity activity)
       {
           mWeakReference=new WeakReference<>(activity);
       }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            MainActivity activity=mWeakReference.get();
            switch (msg.what)
            {
                case CODE:
                    if(activity.mTotalCount>MAX_COUNT)
                    {
                        activity.clear();
                        Toast.makeText(activity,"地鼠打完了",Toast.LENGTH_LONG).show();
                        return;
                    }
                    int position=msg.arg1;
                    activity.mouseImageView.setX(activity.mPosition[position][0]);
                    activity.mouseImageView.setY(activity.mPosition[position][1]);
                    activity.mouseImageView.setVisibility(View.VISIBLE);

                    int randomTime=new Random().nextInt(RANDOM_NUMBER)+RANDOM_NUMBER;
                    activity.next(randomTime);
                    break;
            }
        }
    }

注意到这里

 private final WeakReference<MainActivity> mWeakReference;

public MouseHandler(MainActivity activity)
{
    mWeakReference=new WeakReference<>(activity);
}

这里使用弱引用是因为这里有个潜在的Handler内存泄漏问题:

Handler的Message被存储在MesssgeQueue中,有些Message不能马上处理,存在时间很长,就会导致Handler无法被回收,如果Handler时非静态的,Handler也会导致引用他的Activity或者Service不能被回收。解决办法有两个:

1.使用静态的Handler内部类

2.handler持有的对象要使用弱引用

这里用的是第二种方法。

猜你喜欢

转载自blog.csdn.net/xqy3177563/article/details/89388631