как приостановить и остановить изменение ImageView - PullRequest
0 голосов
/ 19 марта 2010

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

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

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

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

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

класс RecipeDisplayThread расширяет тему { логическое значение PleaseWait = false;

    // 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();
                }
                }

            }
        });

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

кнопка возобновления.

спасибо.

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

Я использую 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) {} без какой-либо формы выхода никогда не будет работать. Есть несколько хороших книг на эту тему, таких как эта .

0 голосов
/ 20 марта 2010

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

Я сделал это (согласно 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;

            }
        });

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...