Android - 无法从线程更改GUI

时间:2014-01-28 20:18:57

标签: android multithreading user-interface

长期观察者,第一次作家:P

我遇到了这个问题:

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

首先,我想从Thread的run()方法中滚动Horizo​​ntalScrollView。 第二种情况是,如果线程结束,我想发射“我已经完成”-Event并更改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();
                 }
            }
        }

OnPlaybackFinishedListener的声明可以在Player类中找到,它是PlaySoundThread的父级:

public void addOnPlaybackFinishedListener(){
        tmpListener = new OnPlaybackFinishedListener() {
            @Override
            public void update() {
                scheduledExecutorService.shutdown();
//this is a seconds Listener, which was implemented to test, if the problem still occurs with a little listener chain
                shutdownListener.update();
            }
        };
    }


public void addShutdownListener(OnExecutorShutdown sl){
        this.shutdownListener = sl;
    }

这是MainActivity的一部分,它是Player的父类,并添加了关闭监听器和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();
            }
        });

有人可以帮忙吗?还有另一种方法可以避免这个问题吗?我正在开发Android 2.2 甚至可以从线程中访问UI元素吗?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

您无法从单独的线程修改UI元素,必须从主要UI Thread修改UI元素。关于此主题有很多主题,但您可以使用AsyncTaskonPostExecute()onPreExecute()onProgressUpdate()方法更新用户界面{{3} } class runOnUiThread(Runnable action),或发送MessageActivity