当前位置: 代码迷 >> Android >> ,关于非UI线程更新控件的有关问题。高分哦
  详细解决方案

,关于非UI线程更新控件的有关问题。高分哦

热度:111   发布时间:2016-05-01 21:46:32.0
高手进,关于非UI线程更新控件的问题。高分哦!
下面的代码是实现,进度条随音乐的播放而动,现在我的问题是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项目。。。
------解决方案--------------------
  相关解决方案