java - 为 Android 游戏使用 Aync 任务
问题描述
我正在 Android Studio 中开发 Whack-a-mole 游戏,但我在使用 AsyncTask 时遇到了困难(我们的老师告诉我们要使用它)。
基本上 AsyncTasks 没有做任何事情。
我尝试使用一个 asynctask 来增加 int 并在每次增加时使用新值更改 textview 并且它有效,但是它不适用于我想要它做的事情。
TextView tv;
ImageView iv1;
ImageView iv2;
ImageView iv3;
ImageView iv4;
boolean salir = false;
int puntuacion = 0;
int vidas = 3;
Hilo hilo;
Hilo hilo2;
Hilo hilo3;
Hilo hilo4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
tv = findViewById(R.id.textView);
iv1 = findViewById(R.id.imageView);
iv2 = findViewById(R.id.imageView2);
iv3 = findViewById(R.id.imageView3);
iv4 = findViewById(R.id.imageView4);
hilo = new Hilo(iv1);
hilo2 = new Hilo(iv2);
hilo3 = new Hilo(iv3);
hilo4 = new Hilo(iv4);
hilo.execute();
hilo2.execute();
hilo3.execute();
hilo4.execute();
}
public void updatePuntuacion() {
tv.setText("Puntuacion: " + puntuacion);
}
public void updateVidas() {
}
private class Hilo extends AsyncTask<Void, Void, Integer> {
boolean estado = false;
ImageView img;
public Hilo (ImageView img) {
this.img = img;
}
@Override
protected Integer doInBackground(Void... voids) {
while(!salir){
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (estado) {
puntuacion++;
updatePuntuacion();
} else {
vidas--;
updateVidas();
}
}
});
if(estado) {
try {
Thread.sleep(Math.round(Math.random()*5000+2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
img.setImageResource(R.drawable.topo);
estado=true;
publishProgress();
} else {
try {
Thread.sleep(Math.round(Math.random()*3000+1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
img.setImageResource(R.drawable.blank);
estado=false;
publishProgress();
}
if(puntuacion == 100) {
salir=true;
}
if(vidas == 0) {
salir = true;
}
}
return puntuacion;
}
}
我希望图像视图每 X 秒更改一次图像(这些是随机的),但它们不会。
希望大家能帮帮我,先谢谢了!!!
解决方案
您需要了解异步任务的工作原理。您不能在 "doInBackground" 中完成所有工作。
- 您需要删除 onClickListener 表单 "doInBackground" 。
- 在 imageview onClick 中启动您的异步任务,然后
- 在 "doInBackground" 中完成后台处理后,将图像设置为 "onPostExecute" 中的 imageview。
请通过此https://developer.android.com/reference/android/os/AsyncTask 了解什么是异步任务首先
推荐阅读
- oauth - 使用 Keycloak 和 .NET 核心的基于角色的授权
- html - 为什么具有相同字体大小、行高、填充和高度的文本区域和输入文本垂直对齐方式不同?
- axios - 使用多个请求刷新访问令牌
- angular - 找不到具有未指定名称的控件、动态表单数组
- powerbi - 如何根据用户选择计算列的不同计数?
- r - PDF 输出中的公司徽标仅在第一页
- docker - Traefik 和 Docker Compose 为应用程序路由返回错误网关
- https - 安全 cookie 是否适用于 443 端口的 http 请求?
- php - 服务器子域下载 index.php 而不是执行
- excel - 如果在事件期间将鼠标光标移到列表框之外,则 Excel 在 ListBox_DblClick 之后冻结