音乐播放器,AsyncTask用法

说到AsyncTask, 它是一个已经封装好的异步处理。

使用AsyncTask的时候需要注意以下几点

 

  1. 在主线程中创建AsyncTask对象,如果在副线程中调用的话程序不会报错,但是会直接关掉(我的现象)。
  2. AsyncTask.execute()方法只能执行一次,重复执行的话会报异常
  3. 有三个参数:方法参数,过程参数,结果参数。 这几个参数都是数组,千万要注意。
  4. 在使用的过程中需要处理中间数据的话需要用到 publishProgress(....)方法,该方法可以实现播放mp3的时候当前播放时间的显示。
 
源码为:
package com.rafeal.media;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MediaPlayerActivity extends Activity implements OnClickListener{
/** Called when the activity is first created. */
private Button btnStart;
private Button btnStop;
private TextView txtPosition;
private MediaPlayer mp;
private SeekBar mSB;
PlayTask pt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btnStart = (Button) findViewById(R.id.btn_start);
btnStop = (Button) findViewById(R.id.btn_Stop);
txtPosition = (TextView) findViewById(R.id.txt_position);
mSB = (SeekBar) findViewById(R.id.sb);

mSB.setOnSeekBarChangeListener(new SeekBarListener());
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);


}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_start:
pt = new PlayTask();
/**
* execute method only invoke one time.
*/
pt.execute(R.raw.somebody_to_love);
break;
case R.id.btn_Stop:
mp.pause();
break;
}
}
private class SeekBarListener implements OnSeekBarChangeListener {

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser == true) {
mp.seekTo(progress);
updatePosition(progress/1000);
mp.start();
}

System.out.println("progress "+progress);
System.out.println("fromUser "+fromUser);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mp.pause();
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}

}

/**
* 1. AsyncTask must be invoked on the UI Thread.
* When you invoke it on other Thread application will not crash.
*/
private class PlayTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected Integer doInBackground(Integer... params) {
if(mp == null) {
mp = MediaPlayer.create(MediaPlayerActivity.this, params[0]);
mp.start();
} else {
try {
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
}
mSB.setMax(mp.getDuration());             //SeekBar's max value

while(mp.isPlaying()) {
mSB.setProgress(mp.getCurrentPosition());
publishProgress(mp.getCurrentPosition()/1000);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

return mp.getCurrentPosition();
}

@Override
protected void onProgressUpdate(Integer... values) {
System.out.println("values "+values);
updatePosition(values[0]);

}
}

/**
* Update current playing time
*/
public void updatePosition(int msec) {
if(msec > 60) {
txtPosition.setText(msec/60+":"+msec%60+"/"+mp.getDuration()/1000/60+":"+mp.getDuration()/1000%60);
} else {
txtPosition.setText(msec+"/"+mp.getDuration()/1000/60+":"+mp.getDuration()/1000%60);
}
}
}
 
posted @ 2011-11-30 20:47  卡马克  阅读(379)  评论(1)    收藏  举报