【发布时间】:2014-12-03 05:52:29
【问题描述】:
我正在尝试根据 MediaPlayer 中歌曲的进度更新搜索栏。 我正在使用 Thread 来完成这项任务。
首先我在线程内部使用了 Thred 并尝试更新 UI,但它使应用程序崩溃并说只有原始线程可以附加到视图。
然后我尝试使用可运行线程内的处理程序对其进行更新。这工作正常,但它没有更新搜索栏。当我做日志时,我才知道循环不会进入我的处理程序。我不知道问题出在哪里。请帮我更新 SeekBar。
代码:
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
try {
if ((musicPath != mIRemoteService.getPath())) {
System.out.println("..... MUSIC CHANGE.....");
setOrUpdateData();
updateFragmentLayout();
}
// Displaying Current Duration time/Progress
new Handler().post(new Runnable() {
@Override
public void run() {
try {
songCurrentDurationLabel.setText(""+ Utilities.milliSecondsToTimer(mIRemoteService.position()));
songProgressBar.setProgress((int)mIRemoteService.position());
System.out.println("Runnnnn.........");
//songProgressBar.invalidate();
} catch (RemoteException e) {
e.printStackTrace();
System.out.println("Runnnnn......... EXCEPTION....");
}
}
});
System.out.println("Runnnnn.........MAIN....");
if (!(mIRemoteService.isPlayerRunning())) {
btnPlay.setImageDrawable(getResources().getDrawable(R.drawable.play_now_playing));
mHandler.removeCallbacks(mUpdateTimeTask);
System.out.println("Runnnnn.........MAIN....IF");
}else{
System.out.println("Runnnnn.........MAIN....ELSE");
mHandler.post(mUpdateTimeTask);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
【问题讨论】:
-
您是否遇到任何错误?如果不放一些日志,看看代码的流程是什么,是否卡在某个地方或者没有进入if语句
-
@GoranHoriaMihail 如果我使用 Thread 代替 Handler,那么我得到错误“只有创建视图层次结构的原始线程才能触及其视图。”
-
是的,除了 UI 线程之外,您不能触摸来自其他线程的任何视图。处理程序将在 UI 线程上发布修改,这就是它起作用的原因,是的,您应该使用处理程序。现在使用 handler 时出现什么错误/问题?
-
@GoranHoriaMihail 问题是,我的 seekBar 没有更新进度。然后我检查了日志,我开始知道线程没有按应有的方式调用......我只得到一次日志......然后什么也没有发生......
-
@GoranHoriaMihail 我们可以在 SO 上聊天吗?
标签: android android-view ui-thread android-runonuithread