Android-无法从线程更改GUI
长期观察者,第一次作者:p 我遇到了这个问题: 我似乎无法从playSoundThread中更改任何与android布局有关的内容。 在本例中,我使用EventListeners。我已经试过简单的方法了。我传递了ScrollView,以便线程可以更改它。但当它发生时,线程立即停止。即使我使用EventListeners,同样的问题也会发生。 更改变量和发布日志信息可以正常工作,但布局对象不行 首先,我想从线程的run()方法中滚动一个水平滚动视图。 第二种情况是,如果线程结束,我想触发一个“我完成了”事件并更改ImageButton的图像和功能 下面是线程的run()方法Android-无法从线程更改GUI,android,multithreading,user-interface,Android,Multithreading,User Interface,长期观察者,第一次作者:p 我遇到了这个问题: 我似乎无法从playSoundThread中更改任何与android布局有关的内容。 在本例中,我使用EventListeners。我已经试过简单的方法了。我传递了ScrollView,以便线程可以更改它。但当它发生时,线程立即停止。即使我使用EventListeners,同样的问题也会发生。 更改变量和发布日志信息可以正常工作,但布局对象不行 首先,我想从线程的run()方法中滚动一个水平滚动视图。 第二种情况是,如果线程结束,我想触发一个“我完
public void run() {
if(this.playbackPosition < rhythm.tracks.get(0).sounds.size()) {
for (Track t : rhythm.tracks) {
if (t.sounds.get(this.playbackPosition).equals("1")) {
this.sp.play(t.SoundID, 1, 1, 1, 0, 1);
}
}
this.playbackPosition++;
if ( this.playbackPosition >= (this.scrollIndex*(192/this.zoom)) ){
this.scrollIndex++;
//Here I wanna fire the "Scroll" event
for(ScrollListener sl : scrollListeners){
sl.update(scrollPositions[scrollIndex]);
}
}
}
//This is the point where the playback is finished and the event to change a button is fired
else {
tmpListener.update();
}
}
}
这里是MainActivity的一部分,它是Player的父类,添加了shutdown侦听器和ScrollListener:
awesomePlayer.addScrollListener(new ScrollListener(){
public void update(int position){
Log.i("ScrollListener update()","Running ScrollTo( "+position+", "+VIEW_rhythmscroll.getScrollY()+")");
VIEW_rhythmscroll.scrollTo(position, VIEW_rhythmscroll.getScrollY());
}
});
awesomePlayer.addOnPlaybackFinishedListener();
awesomePlayer.addShutdownListener(new OnExecutorShutdown() {
@Override
public void update() {
// TODO Auto-generated method stub
//This method changes the Pause Button to a Play Button with a new OnClickListener and a new Picture
BUTTON_STOP.performClick();
}
});
有人能帮忙吗?有没有其他方法可以避免这个问题?我正在开发安卓2.2
甚至可以从线程访问UI元素吗
提前感谢:)您不能从单独的线程修改UI元素,UI元素必须从主UI
线程修改。关于这方面有很多主题,但是您可以通过使用类的onPostExecute()
、onPreExecute()
或onProgressUpdate()
方法、类的rununuithread(Runnable action)
,或者通过向类发送消息来更新UI。非常感谢。以下是一些有用的关键字:)
awesomePlayer.addScrollListener(new ScrollListener(){
public void update(int position){
Log.i("ScrollListener update()","Running ScrollTo( "+position+", "+VIEW_rhythmscroll.getScrollY()+")");
VIEW_rhythmscroll.scrollTo(position, VIEW_rhythmscroll.getScrollY());
}
});
awesomePlayer.addOnPlaybackFinishedListener();
awesomePlayer.addShutdownListener(new OnExecutorShutdown() {
@Override
public void update() {
// TODO Auto-generated method stub
//This method changes the Pause Button to a Play Button with a new OnClickListener and a new Picture
BUTTON_STOP.performClick();
}
});