Android-无法从线程更改GUI

Android-无法从线程更改GUI,android,multithreading,user-interface,Android,Multithreading,User Interface,长期观察者,第一次作者:p 我遇到了这个问题: 我似乎无法从playSoundThread中更改任何与android布局有关的内容。 在本例中,我使用EventListeners。我已经试过简单的方法了。我传递了ScrollView,以便线程可以更改它。但当它发生时,线程立即停止。即使我使用EventListeners,同样的问题也会发生。 更改变量和发布日志信息可以正常工作,但布局对象不行 首先,我想从线程的run()方法中滚动一个水平滚动视图。 第二种情况是,如果线程结束,我想触发一个“我完

长期观察者,第一次作者:p

我遇到了这个问题:

我似乎无法从playSoundThread中更改任何与android布局有关的内容。 在本例中,我使用EventListeners。我已经试过简单的方法了。我传递了ScrollView,以便线程可以更改它。但当它发生时,线程立即停止。即使我使用EventListeners,同样的问题也会发生。 更改变量和发布日志信息可以正常工作,但布局对象不行

首先,我想从线程的run()方法中滚动一个水平滚动视图。 第二种情况是,如果线程结束,我想触发一个“我完成了”事件并更改ImageButton的图像和功能

下面是线程的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();
            }
        });