簡體   English   中英

重新啟動活動時,我的asynctasks之一未執行

[英]One of my asynctasks doesn't execute when I re-launch the activity

我有9個異步任務正在運行(8個來自1類,另外1個來自其他類),每當我重新啟動活動時,前8個線程就會運行,但是不同的1個線程卻沒有,我找不到原因。

public class MainActivity extends AppCompatActivity {

TextView tv;

ImageView iv1;
ImageView iv2;
ImageView iv3;
ImageView iv4;
ImageView iv5;
ImageView iv6;
ImageView iv7;
ImageView iv8;

ImageView h1;
ImageView h2;
ImageView h3;

boolean salir;

int puntuacion;
int vidas;

Hilo hilo;
Hilo hilo2;
Hilo hilo3;
Hilo hilo4;
Hilo hilo5;
Hilo hilo6;
Hilo hilo7;
Hilo hilo8;

Ganar ganar;

int cerrar;
boolean fin;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    puntuacion = 0;
    vidas = 3;
    salir = false;
    cerrar = 0;
    fin = false;

    tv = findViewById(R.id.puntuacion);

    iv1 = findViewById(R.id.imageView);
    iv2 = findViewById(R.id.imageView2);
    iv3 = findViewById(R.id.imageView3);
    iv4 = findViewById(R.id.imageView4);
    iv5 = findViewById(R.id.imageView5);
    iv6 = findViewById(R.id.imageView6);
    iv7 = findViewById(R.id.imageView7);
    iv8 = findViewById(R.id.imageView8);

    h1 = findViewById(R.id.heart1);
    h2 = findViewById(R.id.heart2);
    h3 = findViewById(R.id.heart3);

    hilo = new Hilo(iv1);
    hilo2 = new Hilo(iv2);
    hilo3 = new Hilo(iv3);
    hilo4 = new Hilo(iv4);
    hilo5 = new Hilo(iv5);
    hilo6 = new Hilo(iv6);
    hilo7 = new Hilo(iv7);
    hilo8 = new Hilo(iv8);

    ganar = new Ganar();

    BlockingQueue<Runnable> mWorkQueue =
            new LinkedBlockingQueue<Runnable>(9);


    ThreadPoolExecutor mThreadPool =
            new ThreadPoolExecutor(
                    9,
                    9,
                    3,
                    TimeUnit.SECONDS,
                    mWorkQueue
            );

    hilo.executeOnExecutor(mThreadPool);
    hilo2.executeOnExecutor(mThreadPool);
    hilo3.executeOnExecutor(mThreadPool);
    hilo4.executeOnExecutor(mThreadPool);
    hilo5.executeOnExecutor(mThreadPool);
    hilo6.executeOnExecutor(mThreadPool);
    hilo7.executeOnExecutor(mThreadPool);
    hilo8.executeOnExecutor(mThreadPool);

    ganar.executeOnExecutor(mThreadPool);

    iv1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv1, hilo);
        }
    });
    iv2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv2, hilo2);
        }
    });
    iv3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv3, hilo3);
        }
    });
    iv4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv4, hilo4);
        }
    });
    iv5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv5, hilo5);
        }
    });
    iv6.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv6, hilo6);
        }
    });
    iv7.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv7, hilo7);
        }
    });
    iv8.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            click(iv8, hilo8);
        }
    });

}

public void updatePuntuacion() {
    tv.setText("Puntuacion: " + puntuacion);
}

public void updateVidas() {
    if(vidas==2) {
        h3.setVisibility(View.INVISIBLE);
    } else if(vidas==1) {
        h2.setVisibility(View.INVISIBLE);
    } else if(vidas==0) {
        h1.setVisibility(View.INVISIBLE);
    }
}

public void click(ImageView iv, Hilo h) {
    if(h.isEstado()) {
        puntuacion+=10;
        updatePuntuacion();
        h.setEstado(false);
        iv.setImageResource(R.drawable.blank);
    } else {
        vidas-=1;
        updateVidas();
    }
}

private class Hilo extends AsyncTask<Void, Void, Void> {
    public boolean isEstado() {
        return estado;
    }

    ImageView img;
    boolean ganado = false;
    boolean estado;

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public Hilo (ImageView img) {
        this.img = img;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        estado = false;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        if(estado == true) {
            img.setImageResource(R.drawable.blank);
            estado = false;
        } else {
            img.setImageResource(R.drawable.topo);
            estado = true;
        }
    }

    @Override
    protected Void doInBackground(Void... voids) {

        while(!salir) {
            if(fin) {
                cancel(true);
            } else if(estado == true) {
                try {
                    Thread.sleep(Math.round(Math.random()*5000 + 3000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress();
            } else if(estado == false){
                try {
                    Thread.sleep(Math.round(Math.random()*500 + 3000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress();
            } else {
                publishProgress();
            }
        }
        return null;
    }

}

private class Ganar extends AsyncTask<Void, Void, Void> {

    public Ganar () {}

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        fin = true;
        Intent i = new Intent(MainActivity.this, ClasificacionesActivity.class);
        startActivity(i);
    }

    @Override
    protected Void doInBackground(Void... voids) {

        while(!salir) {
            if(vidas < 1) {
                salir = true;
            }
        }
        return null;
    }

}

public void onBackPressed(){

    if(cerrar > 0) {
        Intent a = new Intent(Intent.ACTION_MAIN);
        a.addCategory(Intent.CATEGORY_HOME);
        a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(a);
    } else {
        cerrar++;
        Toast.makeText(getApplicationContext(), "Vuelve a tocar atrás para cerrar la aplicación", Toast.LENGTH_SHORT).show();
    }

}

}

每當我重新啟動活動時,Hilo asynctasks就會運行(當您松開游戲時,它會轉到另一個活動,您可以有意地再次進入游戲),但是Ganar asynctask不會,因此您無法再次松開。

您執行此操作的整個方法是錯誤的。 如果需要使用Thread,則永遠不要一直運行AsyncTask。 而且讓線程忙於循環以尋找要更改的變量從來都不是正確的方法,相反,您應該在更改變量時進行檢查,甚至使用諸如信號量或rxjava之類的異步信號。

最后,除非聲明變量為volatile,否則不能只聲明一個變量並查看線程之間的變化。 否則,編譯器將對其進行優化,並且永遠不會再實際從內存中獲取該值,它將使用本地緩存的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM