:视频播放器与Handler 完美调用
Handler之消息循环
主要是用作在将来定时做某个动作,或者循环性,周期性的做某个动作。主要的接口就是
package com.example.handler_simple;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;public class MainActivity extends Activity {protected static final String TAG = "MainActivity";private static final int MEDIA_PLAYER_READY = 0;private static final int REFRESH_PROGRESS = 1;private Button mStart;private Button mStop;private Button mPause;private SurfaceHolder mSurfaceHolder;private ProgressBar mProgressBar;private SurfaceView mDisplay;private MediaPlayer mMediaPlayer;private Handler mMainHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MEDIA_PLAYER_READY:mProgressBar.setMax(mMediaPlayer.getDuration());mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {public void onCompletion(MediaPlayer mp) {mProgressBar.setProgress(mMediaPlayer.getDuration());mMainHandler.removeMessages(REFRESH_PROGRESS);}});mStart.setEnabled(true);mStop.setEnabled(true);break;case REFRESH_PROGRESS:int cp = mMediaPlayer.getCurrentPosition();mProgressBar.setProgress(cp);int delay = 1000 - (cp % 1000);mMainHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS, delay);break;default:break;}}};protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {// TODO Auto-generated method stubmStart = (Button) this.findViewById(R.id.btn_player);mPause = (Button) this.findViewById(R.id.btn_pause);mProgressBar = (ProgressBar) this.findViewById(R.id.progressbar);mStop = (Button) this.findViewById(R.id.btn_stop);mStart.setOnClickListener(new buttonListenner());mPause.setOnClickListener(new buttonListenner());mStop.setOnClickListener(new buttonListenner());mStop.setEnabled(false);mDisplay = (SurfaceView) findViewById(R.id.surfaceview);mSurfaceHolder = mDisplay.getHolder();mSurfaceHolder.setFixedSize(mDisplay.getWidth(), mDisplay.getHeight());// Do not believe the document, setType is necessary, otherwise, video// won't play correctly//mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_HARDWARE);new Thread(new Runnable() {public void run() {try {Log.e(TAG, "Thread is runing");mMediaPlayer = MediaPlayer.create(getApplication(),R.raw.test);Log.e(TAG, "Thread is runing");mMediaPlayer.setDisplay(mSurfaceHolder);mMainHandler.sendEmptyMessage(MEDIA_PLAYER_READY);} catch (IllegalArgumentException e) {Log.e(TAG, "caught exception e", e);} catch (SecurityException e) {Log.e(TAG, "caught exception e", e);} catch (IllegalStateException e) {Log.e(TAG, "caught exception e", e);}}}).start();}private class buttonListenner implements OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_player: mMediaPlayer.start(); mMainHandler.sendEmptyMessage(REFRESH_PROGRESS); break;case R.id.btn_pause: mMainHandler.removeMessages(REFRESH_PROGRESS); mMediaPlayer.pause(); break;case R.id.btn_stop:break;default:break;}}}@Overrideprotected void onDestroy() {super.onDestroy();mMainHandler.removeMessages(REFRESH_PROGRESS);if (mMediaPlayer != null) {mMediaPlayer.release();}}public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}