先放完成截图:
实现代码:
完成初始化的一些工作:
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持有的对象要使用弱引用
这里用的是第二种方法。