弄个播放器,很奇怪的,把两个例子综合起来,结果,进度条居然不是按之前意想的一秒一秒的进行,而且一开始当线程运行,即进度条可以有读数之后,其他组件都无法发生单击事件,会说无法响应,跪求知道的朋友教教,我想应该是线程的问题的,对这方面不太熟,我贴上源码,希望有朋友可以帮忙一下。
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();
}
}
     }
    }
        
}

解决方案 »

  1.   

    UpdateStatus这个线程写的有问题,使用了while(true)的循环,会导致cpu一直处于100%满负荷的状态。建议可以尝试使用同步机制或者handler的postdelay的方式来实现音乐播放进度的控制。
      

  2.   

    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();

    }
    });
    这有问题吧会一直post消息。while不断循环,这么个处理下去,会很卡
      

  3.   

    UpdateStatus使用了while(true)的循环,导致cpu一直处于100%满负荷的状态。建议使用handler的postdelay的方式来处理进度条的控制。
      

  4.   

    UpdateStatus使用了while(true)的循环,导致cpu一直处于100%满负荷的状态。建议使用handler的postdelay的方式来处理进度条的控制。
      

  5.   

    另外开一个线程 , 配合Handler来处理吧
      

  6.   

    学习一下,正在研究music代码
      

  7.   

    Handler myHandler=new Handler(){ @Override
    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);
        }