Как приостановить / возобновить или остановить поток и отобразить всплывающее окно

1

У меня есть следующий код, который отображает 3... 2... 1, начиная нить:

...
final Handler handler = new Handler();
final TextView textView = (TextView) findViewById(R.id.textView2);
final java.util.concurrent.atomic.AtomicInteger n = new AtomicInteger(3);
final Runnable counter = new Runnable() {
    @Override
    public void run() {
        textView.setText(Integer.toString(n.get()));
        if(n.getAndDecrement() >= 1 )
            handler.postDelayed(this, 1000);
        else {
            textView.setVisibility(View.GONE);
            tv.post(new Roller(900)); //tv is a textView
        }
    }
};
handler.postDelayed(counter, 1000);
...
ImageButton ibStop;
ibStop.setOnClickListener(...() {
    //stop the thread
    //display a popup
});

ImageButton ibPause;
ibPause.setOnClickListener(...() {
    //pause the thread
    //display a popup
});

ImageButton ibPlay;
ibPlay.setOnClickListener(...() {
    //display the `handler` above with the 3...2...1...
    //resume the thread
});

Runnable:

private class Roller implements Runnable
{
    private long delayMillis;
    private Boolean stop = false;

    public Roller(long delayMillis)
    {
        this.delayMillis = delayMillis;
    }

    @Override
    public void run()
    {
        int min = 0;
        int max = 1;
        int n = rand.nextInt(max - min + 1) + min;
        String roll = String.valueOf(n);
        tv.setText("Random number is " + roll); //tv is a textview

        if (roll.equals("0")) {
            inType = 0;
            ibRed.setImageResource(R.drawable.red_selector);
            ibGreen.setImageResource(R.drawable.green_dark);
        }
        if (roll.equals("1")) {
            inType = 1;
            ibRed.setImageResource(R.drawable.red_dark);
            ibGreen.setImageResource(R.drawable.green_selector);
        }

        tv.postDelayed(this, delayMillis);
    }
}

Пожалуйста, помогите мне с остановкой и приостановкой/возобновлением потока.

  • 0
    Вы должны поставить переменную-флаг и изменить ее, если хотите приостановить или продолжить работу.
Теги:
multithreading

1 ответ

3

Как и предлагалось @Alon, вам может понадобиться изменить переменную флага, чтобы приостановить и перезапустить runnable. В частности, вы можете попытаться использовать систему сообщений для Android с помощью обработчика. Не уверен, что это "идеальный метод", но он работал у меня в прошлом:)

  boolean mRunning; int AYE_AYE_CAPTAIN=4; int MESSAGE_PAUSE=3; 
  int MESSAGE_RESUME=2;
  Runnable roller = new Runnable() {
            @Override
            public void run() {
                while(mRunning) {
                    try {
                       // Do your stuff here.
                       /* In case you want to communicate with handler */
                       Message msg = new Message();
                       msg.what=AYE_AYE_CAPTAIN;
                       handler.sendMessage(msg);
                    } catch (InterruptedException e) {
                       // Not good!!!
                    }
                }
            }
        }, timeToRun,this);

        mRunning=true;
        roller.start();

И обработчик для управления текущим состоянием потока.

   /** Handler to keep track of and manage thread runnable state */
   handler = new Handler(Looper.getMainLooper()){

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);

                switch (msg.what) {
                    case MESSAGE_PAUSE:
                        // Take an action 
                        mRunning=false;
                        break;
                    case MESSAGE_RESUME;
                        mRunning = true;
                        // Restart Runnable here.
                        roller.start();
                        break;
                    default:
                        break;
                }
            }
        };

Затем выполните действия с паузой или возобновлением через сообщения.

public void main sendLifeCycleMessage(int MESSAGE) {
    Message awesomeMessage = new Message();

    awesomeMessage.what = MESSAGE; //
    roller.sendMessage(awesomeMessage);
    /* alternatively if your calling from a service:
    mService.getHandler().sendMessage(awesomeMessage);
    */
  • 0
    Как они добавляются в упражнение?
  • 0
    Я не уверен, что понимаю ваш вопрос
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню