这个主要是记录一下。。。
public class DynamicItemAdapter extends BaseAdapter {
private int mLastVoiceIndex;
WeakReference<AudioController> mAudioControllerWeakReference;
public void stopPlayer() {
mLastVoiceIndex = -1;
if (mAudioControllerWeakReference != null && mAudioControllerWeakReference.get() != null) {
mAudioControllerWeakReference.get().stop();
mAudioControllerWeakReference.clear();
mAudioControllerWeakReference = null;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 音频
final AudioController controller = new AudioController(audioIv, audioTv, audioUrl, audioSize);
if (!TextUtils.isEmpty(audioUrl)) {
audioFl.setVisibility(View.VISIBLE);
controller.resetAnim();
audioFl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mLastVoiceIndex != index) {
stopPlayer();
mAudioControllerWeakReference = new WeakReference<>(controller);
mLastVoiceIndex = index;
mAudioControllerWeakReference.get().handle();
} else {
stopPlayer();
}
}
});
return convertView;
}
}
public class AudioController {
/**
* 语音图标
*/
private ImageView mImageView;
/**
* 时间文字
*/
private TextView mTextView;
/**
* 音频总长度
*/
private long millisInFuture;
/**
* 播放间隔
*/
private long countDownInterval = 1000;
private MediaPlayer mediaPlayer;
private AnimationDrawable mAnimationDrawable;
private String mAudioUrl;
private AudioTimeCount mAudioTimeCount;
public AudioController(ImageView imageView, TextView textView, String audioUrl, int millisInFuture) {
this.mImageView = imageView;
this.mTextView = textView;
mAudioUrl = audioUrl;
this.millisInFuture = millisInFuture * 1000;
}
public void handle() {
// 这里需要重新获取src,因为每次动画结束都会重新设置src
mAnimationDrawable = (AnimationDrawable) mImageView.getDrawable();
toPlayAudio(mAudioUrl);
mAnimationDrawable.stop();
mAnimationDrawable.start();
mAudioTimeCount = new AudioTimeCount(millisInFuture, countDownInterval);
mAudioTimeCount.cancel();
mAudioTimeCount.start();
}
public void resetAnim() {
mAnimationDrawable = (AnimationDrawable) mImageView.getDrawable();
mAnimationDrawable.stop();
}
public void stop() {
mAudioTimeCount.cancel();
completeAnim();
releaseMediaPlayer();
}
/**
* stopping MediaPlayer in separate thread because it can take a time
*/
public void releaseMediaPlayer() {
final long time = System.currentTimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
long dy3 = System.currentTimeMillis() - time;
Log.d("AudioController", "======releaseMediaPlayer() taste time ========" + dy3);
}
}).start();
}
private void completeAnim() {
mTextView.setText(millisInFuture / 1000 + "\"");
// 这里需要重新设置src,否则会出现图片效果错误
mImageView.setImageDrawable(mImageView.getResources().getDrawable(R.anim.anim_audio_play));
resetAnim();
}
/**
* 播放音频
* start MediaPlayer in separate thread because it can take a time
*/
private void toPlayAudio(final String url) {
new Thread(new Runnable() {
@Override
public void run() {
toPlay(url);
}
}).start();
}
private void createMediaPlayerIfNeeded() {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
}
private void toPlay(String url) {
try {
createMediaPlayerIfNeeded();
mediaPlayer.setDataSource(url);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer player) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
releaseMediaPlayer();
}
});
mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer player, int what, int extra) {
releaseMediaPlayer();
return false;
}
});
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 定时器去更新语音里面的文字信息
*/
class AudioTimeCount extends CountDownTimer {
public AudioTimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
int time = (int) (millisUntilFinished / 1000);
mTextView.setText(time + "\"");
}
@Override
public void onFinish() {
completeAnim();
}
}
}
这里mediaPlayer.prepareAsync()
以及releaseMediaPlayer
都使用了线程,因为很耗时(网上找了一圈都没有找到好的解决办法,如果你知道请告诉我)