在android中遇到Asynctask问题

时间:2013-08-18 21:16:04

标签: java android android-asynctask ui-thread thread-sleep

我正在为Android开发某种游戏,为了实现这个目的,我正在使用一个在Activity中保存的SurfaceView。

有时需要暂停时,Surfaceview实际上会在画布中绘制一些内容,然后等待并根据存储在Vector中的某些整数进行一些其他的事情。

起初我试图通过使用Thread.sleep()和Systemclock.sleep()来获得这个暂停,它似乎没用,因为线程总是被阻塞,所以即使正确调用绘图方法也没有变化显示了。

Here我看到使用Asynctask做睡眠工作然后举起旗帜应该是完成任务的好主意。

所以我这样做但似乎onPostExecute从未被调用过,所以我的旗帜永远不会升起......

关于如何进行的任何想法?

这是我的第一个Android应用程序,所以请善待你的答案,并尽可能地使用。

非常感谢。

这是暂停方法:

public void pausar(){
    Log.e("pausar", "entro a pausar");
    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            Log.e("pausar", "Empiezo a dormir");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Log.e("pausar", "Acaba el sleep");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            despierta = true;
            Log.e("pausar", "¡¡¡¡¡¡¡¡¡¡¡¡¡¡DESPIERTO!!!!!!!!!!!");
        }
    };

    if(!llamaPausa){
        task.execute();
        llamaPausa = true;
    }
}

这是一个需要暂停的序列播放器方法:

public void reproducirSecuencia(final Canvas canvas){
    reproduciendo = true;
    //TODO: HACER QUE ESTO FUNCIONE!!
    Log.e("reproducirSecuencia", "Entro a reproducir");

    int i = 0;

    while(i < secuencia.size()){

        Object o = secuencia.elementAt(i);
        int num = 0;
        if (o instanceof Integer) {num = (Integer) o;}

        reproducirSonido(num);
        repId = num;
        onDraw(canvas);

        //Log.e("reproducirSecuencia", "repId = " + repId);
        //Log.e("reproducirSecuencia", "Invoco a pintarPiezas");

        i++;

        if(!despierta){
            pausar();
            Log.e("Repsec", "despierta = " + despierta);
        }
        llamaPausa = true;
        despierta = false;**




        //SystemClock.sleep(1000);
        //try {Thread.sleep(1000);}
        //catch (InterruptedException e) {e.printStackTrace();}
    }
    reproduciendo = false;
}

这是logcat:

  

08-18 22:21:54.050 805-904 / com.example.simondeluxe E / onDraw:Entro a onDraw desde repsec

08-18 22:21:54.060 805-904 / com.example.simondeluxe E / pausar:entro a pausar

08-18 22:21:54.060 805-904 / com.example.simondeluxe E / Repsec:despierta = false

08-18 22:21:54.070 805-904 / com.example.simondeluxe E / onDraw:Entro a onDraw desde repsec

08-18 22:21:54.070 805-904 / com.example.simondeluxe E / pausar:entro a pausar

08-18 22:21:54.070 805-904 / com.example.simondeluxe E / Repsec:despierta = false

08-18 22:21:54.080 805-904 / com.example.simondeluxe E / onDraw:Entro a onDraw desde repsec

08-18 22:21:54.080 805-904 / com.example.simondeluxe E / pausar:entro a pausar

08-18 22:21:54.080 805-904 / com.example.simondeluxe E / Repsec:despierta = false

08-18 22:21:54.090 805-904 / com.example.simondeluxe E / onDraw:Entro a onDraw desde repsec

08-18 22:21:54.090 805-904 / com.example.simondeluxe E / pausar:entro a pausar

08-18 22:21:54.090 805-904 / com.example.simondeluxe E / Repsec:despierta = false

1 个答案:

答案 0 :(得分:0)

由于AsyncTask中的这段代码,您的onPausar()永远不会执行:

if(!llamaPausa){
        task.execute();
        llamaPausa = true;
    }

llamaPausa的值始终为true,我在代码中看不到将其设置为false,因此前一个语句可以执行。