使用Handler实现打地鼠实例(上)。
该说不说,上代码!
首先,diglettactivity代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:orientation="horizontal">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="146dp"
android:layout_marginBottom="23dp"
android:insetLeft="0"
android:insetTop="0"
android:insetRight="0"
android:insetBottom="0"
android:text="@string/begin" />
<ImageView
android:id="@+id/image_View"
android:layout_width="80dp"
android:layout_height="80dp"
android:visibility="gone"
app:srcCompat="@drawable/diglett" />
<TextView
android:id="@+id/text_View"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="155dp"
android:layout_marginTop="312dp"
android:text="TextView" />
</RelativeLayout>
首先,初始化控件:
private void initView() {
mResultTextView = findViewById(R.id.text_View);
mDiglettImageView = findViewById(R.id.image_View);
mStarButton = findViewById(R.id.button);
mStarButton.setOnClickListener(this);
}
然后打地鼠所在的坐标用二维数组表示:
//坐标用二维数组表示
public int[][] mPosition=new int[][]{
{342,180},{432,880},
{354,215},{456,741},
{258,180},{147,880},
{126,456},{159,426}
};
做一个handler,实现handlers,不然会引起内存泄露:
public static class DiglettHandler extends Handler{
public final WeakReference<DiglettActivity> mWeakReference;
public DiglettHandler(DiglettActivity activity) {
this.mWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
DiglettActivity activity=mWeakReference.get();
switch (msg.what){
case 123:
break;
}
}
}
然后分别写start()和next()方法:
private void start() {
//发送消息 handlers sendmessagedelayer
}
public void next(int delayTime){
int position=new Random().nextInt(mPosition.length);
Message message=Message.obtain();
message.what=123;
message.arg1=position;
mHandler.sendMessageDelayed(message,delayTime);
}
完整代码如下:
package com.example.handlerproject;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.lang.ref.WeakReference;
import java.util.Random;
public class DiglettActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mResultTextView;
private ImageView mDiglettImageView;
private Button mStarButton;
//坐标用二维数组表示
public int[][] mPosition=new int[][]{
{342,180},{432,880},
{354,215},{456,741},
{258,180},{147,880},
{126,456},{159,426}
};
private int mTotalCount;
private int mSuccess;
public static final int Max_count=10;
private DiglettHandler mHandler=new DiglettHandler(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diglettactivity);
//初始化控件
initView();
}
private void initView() {
mResultTextView = findViewById(R.id.text_View);
mDiglettImageView = findViewById(R.id.image_View);
mStarButton = findViewById(R.id.button);
mStarButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
start();
break;
}
}
private void start() {
//发送消息 handlers sendmessagedelayer
}
public void next(int delayTime){
int position=new Random().nextInt(mPosition.length);
Message message=Message.obtain();
message.what=123;
message.arg1=position;
mHandler.sendMessageDelayed(message,delayTime);
}
//做一个handler,实现handlers,不然会引起内存泄露
public static class DiglettHandler extends Handler{
public final WeakReference<DiglettActivity> mWeakReference;
public DiglettHandler(DiglettActivity activity) {
this.mWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
DiglettActivity activity=mWeakReference.get();
switch (msg.what){
case 123:
break;
}
}
}
}