Ответ 1
Вы пробовали с:
@Override
public void onPause()
{
handler.removeCallbacks(Play);
Soundmanager.autoPause()
}
Ger
У меня есть обработчик, который я использую следующим образом:
handler.postDelayed(Play, 1000);
когда мое приложение onPause() вызывается до того, как это будет сделано, мне нужно приостановить его и сказать ему, чтобы он не выполнял "postDelayed" до тех пор, пока я не вернусь.
Это возможно, или есть альтернативный способ?
Моя проблема в том, что когда вызывается onPause(), я приостанавливаю звук (SoundManager), но если после этого вызывается этот handler.postDelayed, звук не будет приостановлен и будет продолжать воспроизводиться с моим приложением в фоновом режиме.
@Override
public void onPause()
{
Soundmanager.autoPause()
}
но затем postDelayed после 1000ms снова запускает воспроизведение звука.
Вы пробовали с:
@Override
public void onPause()
{
handler.removeCallbacks(Play);
Soundmanager.autoPause()
}
Ger
Вам нужно подклассом 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
// ...
}
}
//...
}
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);
}
}
}
Изменение ответа от 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)
}
}
}