Java 在android中使用Asynctask时遇到问题

Java 在android中使用Asynctask时遇到问题,java,android,android-asynctask,ui-thread,thread-sleep,Java,Android,Android Asynctask,Ui Thread,Thread Sleep,我正在为android开发某种游戏,为了达到这个目的,我使用了一个活动中的SurfaceView 有时需要暂停,因此Surfaceview实际上在画布中绘制了一些东西,然后它会等待,并根据存储在向量中的一些整数间接地绘制其他东西 起初,我试图通过使用Thread.sleep()和Systemclock.sleep()来获得这种暂停,但这似乎是毫无用处的,因为线程总是被阻塞,因此即使正确调用绘图方法,也不会显示任何更改 我看到,使用异步任务完成睡眠任务,然后升起旗帜应该是完成任务的好主意 所以我这

我正在为android开发某种游戏,为了达到这个目的,我使用了一个活动中的SurfaceView

有时需要暂停,因此Surfaceview实际上在画布中绘制了一些东西,然后它会等待,并根据存储在向量中的一些整数间接地绘制其他东西

起初,我试图通过使用Thread.sleep()和Systemclock.sleep()来获得这种暂停,但这似乎是毫无用处的,因为线程总是被阻塞,因此即使正确调用绘图方法,也不会显示任何更改

我看到,使用异步任务完成睡眠任务,然后升起旗帜应该是完成任务的好主意

所以我这么做了,但似乎onPostExecute从未被调用,所以我的旗帜从未升起

有什么办法吗

这是我的第一个安卓应用程序,所以请对你的答案尽量和蔼可亲

非常感谢

以下是暂停方法:

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 pausar(){
Log.e(“pausar”、“entro a pausar”);
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…参数){
Log.e(“pausar”、“Empiezo a dormir”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
Log.e(“pausar”、“Acaba el sleep”);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
鄙视A=正确;
Log.e(“pausar”,尽管如此!!!!!!!”;
}
};
如果(!llamaPausa){
task.execute();
llamaPausa=真;
}
}
这是一种需要暂停的序列播放器方法:

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;
}
public void reproducersecuencia(最终画布){
复制值=真;
//TODO:HACHER QUE ESTO FUNCIONE!!
Log.e(“复制品”、“复制品”);
int i=0;
而(i
以下是日志:

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:sbeerta=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:sbeerta=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:sbeerta=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/Repsec:sbeerta=false

您的
AsyncTask
将永远不会执行,因为
onPausar()
中有这段代码:


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

就是这样!我已经添加了一个片段。请将代码发布到您实际调用任务的位置。当您调用
pausar()
时,
llamaPausa
的值是多少?如果(!skeerta)
看起来合理,你能在
行的上方放一条log语句(
log.d(this.toString(),llamaPausa+“”)
)吗。。。我正在尽快修正调用的逻辑,无论如何,我会想出一些办法;asyncTask是否声明得很好,或者在参数或其他方面会有任何错误?您是否对其进行过排序?请原谅我在解决此问题时迟到了这么久。我无法解决AsyncTask问题,但我发现了一些东西;我试图在一个与主方法不同的方法中进入睡眠状态,似乎睡眠在那里不起作用,但如果系统时钟睡眠或线程睡眠在调用“ReproductirSecuencia”的主循环中,UI线程不会被阻塞,我花了很多时间才明白这一点。非常感谢你的努力,马特!
if(!llamaPausa){
        task.execute();
        llamaPausa = true;
    }