下面的代码是实现,进度条随音乐的播放而动,现在我的问题是new TimerTask()里开了一个线程,这个新开的底算是UI线程里的,还是新开的一个子线程?如果是子线程的话,但我这段代码是可以更新UI线程里的进度条,不是说只能在UI线程里更新控件吗?这是不是很怪异,期待大虾们的解答
还有一个问题就是怎么判断是UI线程与非UI线程,是不是new了一个 Thread(),重写了里面的Run方法,那这里面的方法是不是就算是子线程了?
public void onCreate(Bundle savedInstanceState) {
//设置进度条
seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(mediaPlayer.getDuration());// 设置最大刻度
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
Toast.makeText(MainActivity.this, "onProgressChanged", 1).show();
}
public void onStartTrackingTouch(SeekBar seekBar) {// 开始拖动
Toast.makeText(MainActivity.this, "开始拖动", 1).show();
}
public void onStopTrackingTouch(SeekBar seekBar) {// 结束拖动
Toast.makeText(MainActivity.this, "结束拖动", 1).show();
mediaPlayer.start();
Toast.makeText(MainActivity.this, String.valueOf(seekBar.getProgress()), 1).show();
mediaPlayer.seekTo(seekBar.getProgress());
}
});
Timer timer=new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
还有一个问题就是,我做的是一个音乐播放器,想让他后台运行,我在onPause方法里写 启动一个后台播放的service,我按home键,音乐可以正常播放,但我按了返回键,音乐就停止了,问题的原因就是不能使用bindService,因为调用者退出,服务也随之退出,但如果用startService的话,我就无法通过Intent来传参了,Intent service = new Intent(MainActivity.this, AudioService.class);
service.putExtra("position", position);
service.putExtra("filepath", audioFile.getAbsolutePath());
,[email protected]
public IBinder onBind(Intent intent) {
position = intent.getIntExtra("position", 0);
filepath=intent.getStringExtra("filepath");
Log.i(TAG,String.valueOf(position));
return null;
}
因为onBind方法只有bindService 方法时才会调用,我就无法获得要播放的路径和要播放的时间点了
@Override
protected void onPause() {
Intent service = new Intent(MainActivity.this, AudioService.class);
service.putExtra("position", position);
service.putExtra("filepath", audioFile.getAbsolutePath());
this.bindService(service, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IplayMp3 = (IPlayMp3) service;
IplayMp3.play();
}
@Override
public void onServiceDisconnected(ComponentName name) {
IplayMp3 = null;
}
}, BIND_AUTO_CREATE);
super.onPause();
}
------解决方案--------------------
不管是bind还是startservice,service总是要创建的,如onCreate(),你可以在这个里面getIntExtra吧。
------解决方案--------------------
个人理解:
对于是否非为UI线程,我的理解是关于对UI的操作要用handle来处理,感觉没有必要分的要这么细
关于Service需要传值可以通过自定义工具类的中的静态变量为传值。个人感觉这种效率是最高的。
------解决方案--------------------
去verycd上搜一下android
有个教程,mars的,正在讲一个MP3项目。。。
------解决方案--------------------