弄个播放器,很奇怪的,把两个例子综合起来,结果,进度条居然不是按之前意想的一秒一秒的进行,而且一开始当线程运行,即进度条可以有读数之后,其他组件都无法发生单击事件,会说无法响应,跪求知道的朋友教教,我想应该是线程的问题的,对这方面不太熟,我贴上源码,希望有朋友可以帮忙一下。
package com.test;import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.database.DataSetObserver;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.*;public class music extends ListActivity {
/** Called when the activity is first created. */
private ImageButton mFrontImageButton = null;
private ImageButton mStopImageButton = null;
private ImageButton mStartImageButton = null;
private ImageButton mPauseImageButton = null;
private ImageButton mNextImageButton = null;
/* MediaPlayer对象 */
public MediaPlayer mMediaPlayer = null;
private int currentPosition;
private ProgressBar progressBar;
private TextView textView;
private Handler mHandler = new Handler();
private UpdateStatus thread;
/* 播放列表 */
private List<String> mMusicList = new ArrayList<String>();
private final String PATH="/sdcard/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();//初始化各个组件
musicList();
dealListener();//处理按钮监听事件
thread=new UpdateStatus();
thread.start();
//
}
private void init()
{
mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);
mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);
progressBar=(ProgressBar)findViewById(R.id.progress_bar);
/*构建MediaPlayer对象*/
mMediaPlayer=new MediaPlayer();
textView=(TextView)findViewById(R.id.textView);
textView.setFocusable(false);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
currentPosition=position;
playMusic(PATH+mMusicList.get(position));
setTitle(PATH+mMusicList.get(position));
}
private void dealListener()
{
//停止按钮
mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
/* 是否正在播放 */
if (mMediaPlayer.isPlaying())
{
//重置MediaPlayer到初始状态
mMediaPlayer.reset();
}
}
});
//开始按钮
mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
playMusic(PATH + mMusicList.get(currentPosition));
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
//暂停
mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if (mMediaPlayer.isPlaying())
{
/* 暂停 */
mMediaPlayer.pause();
}
else
{
/* 开始播放 */
mMediaPlayer.start();
}
}
});
//下一首
mNextImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
nextmusic();
}
});
//上一首
mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
frontMusic();
}
});
}
private void playMusic(String path)
{
try {
if(mMediaPlayer!=null)
mMediaPlayer.reset();
/* 设置要播放的文件的路径 */
mMediaPlayer.setDataSource(path);
/* 准备播放 */
mMediaPlayer.prepare();
/* 开始播放 */
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nextmusic();
}
});
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private void nextmusic()
{ // currentPosition=currentPosition+1;
if(++currentPosition>=mMusicList.size())
{
currentPosition=0;
}
playMusic(PATH+mMusicList.get(currentPosition));
}
private void frontMusic()
{
if(--currentPosition<0)
{
currentPosition=mMusicList.size();
}
else
{
playMusic(PATH+mMusicList.get(currentPosition));
}
}
public class ListAdapter extends ArrayAdapter {
public ListAdapter(final Context context, final int resource,
final List<String> string) {
super(context, resource, string);
}
public final View getView(final int position, View convertView,
final ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
convertView = inflater.inflate(R.layout.arrayset, parent, false);
TextView textView = (TextView)convertView.findViewById(R.id.EditText);
textView.setText(music.this.mMusicList.get(position));
return convertView;
}
} public void musicList()
{
File home=new File(PATH);
if(home.listFiles(new MusicFilter()).length>0)
{
for(File file:home.listFiles(new MusicFilter()))
mMusicList.add(file.getName());
setListAdapter(new ListAdapter(this,android.R.layout.simple_list_item_1,mMusicList));
}
}
/* 过滤文件类型 */
class MusicFilter implements FilenameFilter {
public boolean accept(File dir, String name)
{
//这里还可以设置其他格式的音乐文件
return (name.endsWith(".mp3"));
}
}
class UpdateStatus extends Thread{
@Override
public void run() {
while (true) {
while(mMediaPlayer.isPlaying())
mHandler.post(new Runnable() {
public void run(){
try {
progressBar.setMax(mMediaPlayer.getDuration());
progressBar.setProgress(mMediaPlayer.getCurrentPosition());
int pos = 0;
pos = mMediaPlayer.getCurrentPosition();
int min = (pos/1000)/60;
int sec = (pos/1000)%60;
int maxPos = mMediaPlayer.getDuration();
int maxMin = (maxPos/1000)/60;
int maxSec = (maxPos/1000)%60;
String maxTime = new String();
if(maxSec<10){
maxTime = ""+maxMin+":0"+maxSec;
}else{
maxTime = ""+maxMin+":"+maxSec;
}
if(sec<10)
textView.setText(""+min+":0"+sec+"/"+maxTime);
else
textView.setText(""+min+":"+sec+"/"+maxTime);
} catch (Exception e) {
e.printStackTrace();
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package com.test;import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.database.DataSetObserver;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.*;public class music extends ListActivity {
/** Called when the activity is first created. */
private ImageButton mFrontImageButton = null;
private ImageButton mStopImageButton = null;
private ImageButton mStartImageButton = null;
private ImageButton mPauseImageButton = null;
private ImageButton mNextImageButton = null;
/* MediaPlayer对象 */
public MediaPlayer mMediaPlayer = null;
private int currentPosition;
private ProgressBar progressBar;
private TextView textView;
private Handler mHandler = new Handler();
private UpdateStatus thread;
/* 播放列表 */
private List<String> mMusicList = new ArrayList<String>();
private final String PATH="/sdcard/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();//初始化各个组件
musicList();
dealListener();//处理按钮监听事件
thread=new UpdateStatus();
thread.start();
//
}
private void init()
{
mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);
mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);
progressBar=(ProgressBar)findViewById(R.id.progress_bar);
/*构建MediaPlayer对象*/
mMediaPlayer=new MediaPlayer();
textView=(TextView)findViewById(R.id.textView);
textView.setFocusable(false);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
currentPosition=position;
playMusic(PATH+mMusicList.get(position));
setTitle(PATH+mMusicList.get(position));
}
private void dealListener()
{
//停止按钮
mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
/* 是否正在播放 */
if (mMediaPlayer.isPlaying())
{
//重置MediaPlayer到初始状态
mMediaPlayer.reset();
}
}
});
//开始按钮
mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
playMusic(PATH + mMusicList.get(currentPosition));
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
//暂停
mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if (mMediaPlayer.isPlaying())
{
/* 暂停 */
mMediaPlayer.pause();
}
else
{
/* 开始播放 */
mMediaPlayer.start();
}
}
});
//下一首
mNextImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
nextmusic();
}
});
//上一首
mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
frontMusic();
}
});
}
private void playMusic(String path)
{
try {
if(mMediaPlayer!=null)
mMediaPlayer.reset();
/* 设置要播放的文件的路径 */
mMediaPlayer.setDataSource(path);
/* 准备播放 */
mMediaPlayer.prepare();
/* 开始播放 */
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nextmusic();
}
});
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private void nextmusic()
{ // currentPosition=currentPosition+1;
if(++currentPosition>=mMusicList.size())
{
currentPosition=0;
}
playMusic(PATH+mMusicList.get(currentPosition));
}
private void frontMusic()
{
if(--currentPosition<0)
{
currentPosition=mMusicList.size();
}
else
{
playMusic(PATH+mMusicList.get(currentPosition));
}
}
public class ListAdapter extends ArrayAdapter {
public ListAdapter(final Context context, final int resource,
final List<String> string) {
super(context, resource, string);
}
public final View getView(final int position, View convertView,
final ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
convertView = inflater.inflate(R.layout.arrayset, parent, false);
TextView textView = (TextView)convertView.findViewById(R.id.EditText);
textView.setText(music.this.mMusicList.get(position));
return convertView;
}
} public void musicList()
{
File home=new File(PATH);
if(home.listFiles(new MusicFilter()).length>0)
{
for(File file:home.listFiles(new MusicFilter()))
mMusicList.add(file.getName());
setListAdapter(new ListAdapter(this,android.R.layout.simple_list_item_1,mMusicList));
}
}
/* 过滤文件类型 */
class MusicFilter implements FilenameFilter {
public boolean accept(File dir, String name)
{
//这里还可以设置其他格式的音乐文件
return (name.endsWith(".mp3"));
}
}
class UpdateStatus extends Thread{
@Override
public void run() {
while (true) {
while(mMediaPlayer.isPlaying())
mHandler.post(new Runnable() {
public void run(){
try {
progressBar.setMax(mMediaPlayer.getDuration());
progressBar.setProgress(mMediaPlayer.getCurrentPosition());
int pos = 0;
pos = mMediaPlayer.getCurrentPosition();
int min = (pos/1000)/60;
int sec = (pos/1000)%60;
int maxPos = mMediaPlayer.getDuration();
int maxMin = (maxPos/1000)/60;
int maxSec = (maxPos/1000)%60;
String maxTime = new String();
if(maxSec<10){
maxTime = ""+maxMin+":0"+maxSec;
}else{
maxTime = ""+maxMin+":"+maxSec;
}
if(sec<10)
textView.setText(""+min+":0"+sec+"/"+maxTime);
else
textView.setText(""+min+":"+sec+"/"+maxTime);
} catch (Exception e) {
e.printStackTrace();
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
mHandler.post(new Runnable() {
public void run(){
try {
progressBar.setMax(mMediaPlayer.getDuration());
progressBar.setProgress(mMediaPlayer.getCurrentPosition());
int pos = 0;
pos = mMediaPlayer.getCurrentPosition();
int min = (pos/1000)/60;
int sec = (pos/1000)%60;
int maxPos = mMediaPlayer.getDuration();
int maxMin = (maxPos/1000)/60;
int maxSec = (maxPos/1000)%60;
String maxTime = new String();
if(maxSec<10){maxTime = ""+maxMin+":0"+maxSec;}else{maxTime = ""+maxMin+":"+maxSec; }if(sec<10)
textView.setText(""+min+":0"+sec+"/"+maxTime);
else
textView.setText(""+min+":"+sec+"/"+maxTime);} catch (Exception e) {
e.printStackTrace();
}
}
});
这有问题吧会一直post消息。while不断循环,这么个处理下去,会很卡
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
progressBar.setMax(msg.arg1);
progressBar.setProgress(msg.arg2);
textView.setText(String.valueOf(msg.obj));
super.handleMessage(msg);
}
};
class UpdateStatus extends Thread{
@Override
public void run() {
while (true) {
while(mMediaPlayer.isPlaying()){
Message msg=new Message();
msg.arg1=mMediaPlayer.getDuration();
msg.arg2=mMediaPlayer.getCurrentPosition();
int pos = 0;
pos = mMediaPlayer.getCurrentPosition();
int min = (pos/1000)/60;
int sec = (pos/1000)%60;
int maxPos = mMediaPlayer.getDuration();
int maxMin = (maxPos/1000)/60;
int maxSec = (maxPos/1000)%60;
String maxTime = new String();
if(maxSec<10){
maxTime = ""+maxMin+":0"+maxSec;
}else{
maxTime = ""+maxMin+":"+maxSec;
} if(sec<10)
msg.obj=""+min+":0"+sec+"/"+maxTime;
else
msg.obj=""+min+":"+sec+"/"+maxTime; } catch (Exception e) {
e.printStackTrace();
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
myHandler.sendMessage(msg);
}