2013-08-18 2 views
0

Я разрабатываю какую-то игру для android, чтобы выполнить эту задачу. Я использую SurfaceView, который удерживается внутри Activity.Проблемы с Asynctask в android

Иногда бывает, когда требуется пауза, поэтому 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 Е/pausar: Entro pausar

08-18 22: 21: 54,060 805-904/com.example.simondeluxe Е/repsec: Despierta = ложная

08-18 22: 21: 54,070 805-904/com.example.simondeluxe Е/OnDraw: Entro OnDraw Цена от 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: d espierta = ложная

08-18 22: 21: 54,080 805-904/com.example.simondeluxe Е/OnDraw: Entro OnDraw Цена от repsec

08-18 22: 21: 54,080 805-904/ком .example.simondeluxe Е/pausar: Entro pausar

08-18 22: 21: 54.080 805-904/com.example.simondeluxe E/Repsec: Despierta = ложная

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.exam PLE.simondeluxe E/pausar: Entro pausar

08-18 22: 21: 54.090 805-904/com.example.simondeluxe E/Repsec: Despierta = ложь

+0

Сообщение logcat please – Matt

+0

Вот оно! Я уже добавил кусок. – Luis

+0

Отправьте код, в котором вы активируете вызов своей задачи. –

ответ

0

Ваш AsyncTask никогда не будет выполняться из-за этого куска код здесь в onPausar():

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

значение llamaPausa всегда верно, и я не вижу нигде в коде, где он получает значение лОЖЬ, так что предыдущий оператор может выполнить.

+0

Кажется разумным ... Я исправляю логику этого вызова как можно скорее, и что-то придумать; это хорошо спроектированная асинхронная программа или там была бы какая-либо ошибка с параметрами или любой другой вещью? – Luis

+0

Вы когда-нибудь получали эту сортировку? – Matt

+0

Извините меня за то, что вы так поздно решили решить эту проблему. Я не мог решить проблему AsyncTask, но я нашел что-то; Я пытался уснуть внутри метода, отличный от основного, и кажется, что сон не будет работать там, но если спящий режим или спящий поток находятся в mainloop, где вызывается «reproducirSecuencia», пользовательский интерфейс нить не блокируется, мне потребовалось много времени, чтобы понять это. Большое спасибо за ваши усилия Мэтт! – Luis

Смежные вопросы