2010-03-18 4 views
0

я быть_наст ImageView, в котором изображение переключается каждый 5с, я пытаюсь добавить паузу икак сделать паузу и остановить меняющийся ImageView

кнопки Возобновить, которая может остановить и перезапустить действие. Я использую Handler, Runnable и

postDelay() для переключателя изображения, и я помещаю код в onResume. я думаю об использовании

wait and notify for pause и resume, но это будет означать создание дополнительной нити. так

далеко за нить, у меня есть это:

класс RecipeDisplayThread расширяет тему { булево pleaseWait = ложь;

// This method is called when the thread runs 
    public void run() { 
     while (true) { 
      // Do work 

      // Check if should wait 
      synchronized (this) { 
       while (pleaseWait) { 
        try { 
         wait(); 
        } catch (Exception e) { 
        } 
       } 
      } 

      // Do work 
     } 
    } 

} 

и в OnCreate основного вида деятельности в():

кнопки
 Button pauseButton = (Button) findViewById(R.id.pause); 

     pauseButton.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       while (true) { 

       synchronized (thread) 
       { 
        thread.pleaseWait = true; 
        } 
       } 

      } 
     }); 

     Button resumeButton = (Button) findViewById(R.id.resume); 

     resumeButton.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       while (true) { 

       // Resume the thread 
       synchronized (thread) 
       { 
        thread.pleaseWait = false; 
        thread.notify(); 
       } 
       } 

      } 
     }); 

паузы, кажется, работает, но после того, что я не могу нажать любую другую кнопку, например,

возобновить.

спасибо.

+0

Пожалуйста, выберите более полезные теги, чем «пауза» и «резюме». – skaffman

ответ

2

я использую Handler, Runnable и postDelay() для переключения изображений

Почему? Почему бы не использовать postDelayed() и избавиться от Thread и Handler?

void doTheImageUpdate() { 
    if (areWeStillRunning) { 
     myImageView.setImageResource(R.drawable.whatever); 
     myImageView.postDelayed(updater, 5000); 
    } 
    } 

    Runnable updater=new Runnable() { 
    public void run() { 
     doTheImageUpdate(); 
    } 
    }; 

Если вы хотите, чтобы начать обновление, установите areWeStillRunning в true и вызвать doTheImageUpdate(). Когда вы хотите прекратить обновление, установите areWeStillRunning на номер false. Вам нужно будет решить крайний случай, когда пользователь нажимает паузу и возобновляется в течение 5 секунд, чтобы не допустить удвоения, но я оставляю это как упражнение для читателя.

Если вы действительно хотите использовать фоновый поток, вам нужно узнать больше об использовании фоновых потоков. Например, while(true) {} без какой-либо формы выхода никогда не будет работать. Есть несколько хороших книг по теме, таких как this one.

+0

сейчас он работает, мне просто нужно разобраться с краями. Спасибо за вашу помощь. – user270811

0

жаль ответить на мой собственный вопрос, но раздел комментариев слишком мал.

я сделал это (за CommonsWare):

private Runnable mWaitRunnable = new Runnable() { 
    public void run() 
    { 
     doTheImageUpdate(); 
    } 
}; 

private void doTheImageUpdate() 
{ 
    try 
    { 
     if(bStillRunning) 
     { 

      sText = "Step one: unpack egg"; 
      iDrawable = R.drawable.monster2; 

      t.setText(sText); 
      mImage = BitmapFactory.decodeResource(getResources(), iDrawable); 

      imageView.setImageBitmap(mImage); 

      tts1 = new TTS(getApplicationContext(), ttsInitListener, true);    

      mHandler.postDelayed(mWaitRunnable, 5000); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.e("mWaitRunnable.run()", e.getMessage()); 
    } 

} 



     Button pauseButton = (Button) findViewById(R.id.pause); 

     pauseButton.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 

       bStillRunning = false; 

      } 
     }); 

     Button resumeButton = (Button) findViewById(R.id.resume); 

     resumeButton.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 

       bStillRunning = true; 

      } 
     }); 

снова приостановить работы, но резюме не делает. и я уже упростил свою проблему, сделав текст, изображение и время задержки одинаковыми для всех шагов. Я надеялся сделать эту переменную, в дополнение к количеству шагов.

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