如何在删除回调后重用 Android-Handler
How to reuse Android-Handler after removing callbacks
我有一个服务,我在其中使用一个处理程序来每毫秒获取媒体播放器的时间。
但是,当我的服务未绑定到任何 activity 时,我想从 onUnbind() 中的处理程序中删除回调;服务方法。
当服务绑定到 activity 时,我想通过在 Rebind/onBind();
上向它发布相同的回调来重用我的处理程序
但是,它不起作用。
需要帮助!
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.lifecycle.MutableLiveData;
import java.io.IOException;
public class MediaService extends Service {
private static final String TAG = "MediaService";
IBinder myBinder = new MyBinder();
MediaPlayer mediaPlayer = new MediaPlayer();
boolean isPrepared = false;
MutableLiveData<Integer> currrentTime = new MutableLiveData<>();
MutableLiveData<Integer> mediaPlayerDuration = new MutableLiveData<>();
private Handler handlerTime;
@Nullable
@Override
public IBinder onBind(Intent intent) {
handlerTime = new Handler();
//readyTime method posts delayed runnable on the handler @recurring
readyTime();
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
handlerTime.removeCallbacks(curTimeRunnable);
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: MediaService Created");
}
class MyBinder extends Binder {
MediaService getService() {
return MediaService.this;
}
}
public void setPathAndPlay(String path) {
isPrepared = false;
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
isPrepared = true;
mp.start();
mediaPlayerDuration.postValue(mediaPlayer.getDuration());
}
});
} catch (IOException e) {
Log.d(TAG, "setPathAndPlay: Error");
e.printStackTrace();
}
}
public boolean isMediaPlaying() {
return this.mediaPlayer.isPlaying();
}
public void pause() {
mediaPlayer.pause();
}
public void resume() {
try {
mediaPlayer.start();
} catch (Exception e) {
}
}
public void seekTo(int millis) {
mediaPlayer.seekTo(millis);
}
public int getTimeTotal() {
return mediaPlayer.getDuration();
}
public int getCurrentPos() {
return mediaPlayer.getCurrentPosition();
}
Runnable curTimeRunnable = new Runnable() {
@Override
public void run() {
currrentTime.postValue(mediaPlayer.getCurrentPosition());
Log.d(TAG, "run: VALUE POSTED");
if (handlerTime != null) {
handlerTime.postDelayed(this, 1);
}
}
};
public void readyTime() {
if (handlerTime != null) {
handlerTime.postDelayed(curTimeRunnable, 1);
}
}
}
您可以使用以下方法移除回调
handleTime.removeCallbacksAndMessages(null);
您可以签到doc
如果你想重用你必须做的处理程序:
handler.removeCallbacksAndMessages(null);
在 removeCallbacksAndMessages 的文档中说...
Remove any pending posts of callbacks and sent messages whose obj is token. If token is null, all callbacks and messages will be removed.
希望对你有帮助!
我有一个服务,我在其中使用一个处理程序来每毫秒获取媒体播放器的时间。
但是,当我的服务未绑定到任何 activity 时,我想从 onUnbind() 中的处理程序中删除回调;服务方法。
当服务绑定到 activity 时,我想通过在 Rebind/onBind();
上向它发布相同的回调来重用我的处理程序但是,它不起作用。 需要帮助!
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.lifecycle.MutableLiveData;
import java.io.IOException;
public class MediaService extends Service {
private static final String TAG = "MediaService";
IBinder myBinder = new MyBinder();
MediaPlayer mediaPlayer = new MediaPlayer();
boolean isPrepared = false;
MutableLiveData<Integer> currrentTime = new MutableLiveData<>();
MutableLiveData<Integer> mediaPlayerDuration = new MutableLiveData<>();
private Handler handlerTime;
@Nullable
@Override
public IBinder onBind(Intent intent) {
handlerTime = new Handler();
//readyTime method posts delayed runnable on the handler @recurring
readyTime();
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
handlerTime.removeCallbacks(curTimeRunnable);
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: MediaService Created");
}
class MyBinder extends Binder {
MediaService getService() {
return MediaService.this;
}
}
public void setPathAndPlay(String path) {
isPrepared = false;
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
isPrepared = true;
mp.start();
mediaPlayerDuration.postValue(mediaPlayer.getDuration());
}
});
} catch (IOException e) {
Log.d(TAG, "setPathAndPlay: Error");
e.printStackTrace();
}
}
public boolean isMediaPlaying() {
return this.mediaPlayer.isPlaying();
}
public void pause() {
mediaPlayer.pause();
}
public void resume() {
try {
mediaPlayer.start();
} catch (Exception e) {
}
}
public void seekTo(int millis) {
mediaPlayer.seekTo(millis);
}
public int getTimeTotal() {
return mediaPlayer.getDuration();
}
public int getCurrentPos() {
return mediaPlayer.getCurrentPosition();
}
Runnable curTimeRunnable = new Runnable() {
@Override
public void run() {
currrentTime.postValue(mediaPlayer.getCurrentPosition());
Log.d(TAG, "run: VALUE POSTED");
if (handlerTime != null) {
handlerTime.postDelayed(this, 1);
}
}
};
public void readyTime() {
if (handlerTime != null) {
handlerTime.postDelayed(curTimeRunnable, 1);
}
}
}
您可以使用以下方法移除回调
handleTime.removeCallbacksAndMessages(null);
您可以签到doc
如果你想重用你必须做的处理程序:
handler.removeCallbacksAndMessages(null);
在 removeCallbacksAndMessages 的文档中说...
Remove any pending posts of callbacks and sent messages whose obj is token. If token is null, all callbacks and messages will be removed.
希望对你有帮助!