Android, приостановка и возобновление обработчиков вызовов - PullRequest
12 голосов
/ 13 декабря 2010

У меня есть обработчик, который я использую следующим образом:

handler.postDelayed(Play, 1000);

когда мое приложение onPause () вызывается до того, как это сделано, мне нужно приостановить его и сказать ему не выполнять "postDelayed"«пока я не возобновлю.

возможно ли это, или есть альтернативный способ?

Моя проблема в том, что при вызове onPause () я приостанавливаю звук (SoundManager), но если этот обработчикПосле этого вызывается .postDelayed, звук не будет приостановлен и будет продолжать проигрываться с моим приложением в фоновом режиме.

@Override
public void onPause()
{
  Soundmanager.autoPause()
}

, но затем postDelayed через 1000 мс снова начинает воспроизведение звука.

Ответы [ 4 ]

19 голосов
/ 15 марта 2012

Вам необходимо создать подкласс Handler и реализовать методы паузы / возобновления следующим образом (затем просто вызовите handler.pause(), если вы хотите приостановить обработку сообщения, и вызовите handler.resume(), если вы хотите перезапустить его):

class MyHandler extends Handler {
    Stack<Message> s = new Stack<Message>();
    boolean is_paused = false;

    public synchronized void pause() {
        is_paused = true;
    }

    public synchronized void resume() {
        is_paused = false;
        while (!s.empty()) {
            sendMessageAtFrontOfQueue(s.pop());
        }
    }

    @Override
    public void handleMessage(Message msg) {
        if (is_paused) {
            s.push(Message.obtain(msg));
            return;
        }else{
               super.handleMessage(msg);
               // otherwise handle message as normal
               // ...
        }
    }
    //...
}
13 голосов
/ 13 декабря 2010

Вы пробовали с:

@Override
public void onPause()
{
  handler.removeCallbacks(Play);
  Soundmanager.autoPause()
}

Ger

0 голосов
/ 27 июня 2019

Изменение ответа от CpcCrunch .Там handleMessage у меня не работает, поэтому вместо него используется dispatchMessage .Примечание: ниже код написан на Kotlin:

class CustomHandler: Handler() {

    var s = Stack<Message>()
    var is_paused = false

    @Synchronized
    fun pause() {
        is_paused = true
    }

    @Synchronized
    fun resume() {
        is_paused = false
        while (!s.empty()) {
            sendMessageAtFrontOfQueue(s.pop())
        }
    }

    override fun dispatchMessage(msg: Message?) {
        if (is_paused) {
            s.push(Message.obtain(msg))
            return
        } else {
            super.dispatchMessage(msg)
        }
    }
}
0 голосов
/ 11 июля 2018
public class YourActivity extends AppCompatActivity {

    private static boolean handlerflag=false;
    private Handler handler;
    private Runnable runnable;
    private int myind=0,index=0,count=0;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activtiy);         
        //oncreate exe only
        handlerflag=true;
        handler = new Handler();
        startyourtime(0);
 }
  private void  startyourtime(int a) {

    myind=0;
    for (index=a; index<10 ;index++) {
            myind++;
            runnable=new Runnable() {
                count++;
                @Override
                public void run() {
                          //your code here
               }
            };handler.postDelayed(runnable, Constants.TIME_LIMIT * myind);

   }
    @Override
    protected void onPause() {
        super.onPause();
        handlerflag=false;
        handler.removeCallbacksAndMessages(null);
    }
    @Override
    protected void onResume() {
        super.onResume();
        if(!handlerflag)
        {
           startyourtime(count);

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