[英]Android, pausing and resuming handler callbacks
我有一個處理程序,我使用如下:
handler.postDelayed(Play, 1000);
當我的應用程序onPause()在完成之前被調用時,我需要暫停它並告訴它不要執行“postDelayed”直到我恢復。
這是可能的,還是有另一種方式?
我的問題是,當調用onPause()時,我暫停音頻(SoundManager),但如果此后調用此handler.postDelayed,音頻將不會暫停,並將繼續在后台播放我的應用程序。
@Override
public void onPause()
{
Soundmanager.autoPause()
}
但是1000ms后的postDelayed再次啟動音頻播放。
你需要繼承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
// ...
}
}
//...
}
你嘗試過:
@Override
public void onPause()
{
handler.removeCallbacks(Play);
Soundmanager.autoPause()
}
GER
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)
}
}
}
想要在隊列中暫停/恢復Runnables
時,我想出了一個替代CpnCrunch的方法。 要擁有在連接和脫機時調用的方法,一旦聯機,恢復隊列並執行所有可運行的操作。
而不是使用Handler
,使用ExecutorService
:
public class ExecutorQueueService extends ThreadPoolExecutor {
private Stack<Runnable> runnables = new Stack<>();
private boolean paused = false;
public ExecutorQueueService() {
super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
public synchronized void pause() {
paused = true;
}
public synchronized void resume() {
paused = false;
while (!runnables.empty()) {
execute(runnables.pop());
}
}
public synchronized boolean isPaused() {
return paused;
}
@Override
public void execute(Runnable runnable) {
if (paused) {
runnables.push(runnable);
} else {
super.execute(runnable);
}
}
}
使用它類似於Handler,但使用execute(runnable)
而不是post(runnable)
execute(runnable)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.