首页 > 解决方案 > 为 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 秒更改一次图像(这些是随机的),但它们不会。

希望大家能帮帮我,先谢谢了!!!

标签: javaandroid

解决方案


您需要了解异步任务的工作原理。您不能在 "doInBackground" 中完成所有工作。

  1. 您需要删除 onClickListener 表单 "doInBackground" 。
  2. 在 imageview onClick 中启动您的异步任务,然后
  3. 在 "doInBackground" 中完成后台处理后,将图像设置为 "onPostExecute" 中的 imageview。

请通过此https://developer.android.com/reference/android/os/AsyncTask 了解什么是异步任务首先


推荐阅读