0

大家好。我的简单 Android 应用程序现在遇到了很大的问题。

我拥有的 2 个主要元素是绑定的 Service和主要的Activity。我希望 Activity 显示(通过 TextViews)服务发现某些东西的事实。为此,我在 Service 中声明了一个 Listener 接口,处理向他注册的侦听器列表,并使用特定方法通知侦听器。

我的服务

    void notifyNewElement(){
        for (Listener listener : listeners) {
            listener.handleNewElement(this);
        }
    }

    public interface Listener {
        void handleNewElement(MyService sender);
    }

    private List<Listener> listeners = new ArrayList<Listener>();

    public void addListener(Listener listener) {
        this.listeners.add(listener);
    }

    public void removeListener(Listener listener) {
        this.listeners.remove(listener);
    }

主要活动

    buttonStart.setOnClickListener(
                new View.OnClickListener()
                {
                    public void onClick(View view)
                    {
                        registerListener();
                    }
                });
    buttonStop.setOnClickListener(
                new View.OnClickListener()
                {
                    public void onClick(View view)
                    {
                        unresgisterListener();
                    }
                });

    void registerListener(){
        tService.addListener(this);
    }

    void unresgisterListener(){
        tService.removeListener(this);
    }

    public void handleNewElement(MyService sender) {
        Log.d("NEW_ELEM","new element found");
        message_box.setText("new element found");
    }

我当然在 Activity 中恢复了 TextViews 等,我不必在这里显示代码,因为我知道那方面一切都很好。正如您在最后一个方法中看到的那样,Log.d() 工作正常,该方法确实被触发了。但是当我想更新 TextView时,Activity无法做到,而且服务停止了他的计算。有趣的是,如果我取消注册侦听器并再次注册它(通过您可以在 Activity 中看到的 2 个按钮),则在触发 handleNewElement 时服务计算不会再停止,但 TextView 仍然没有更新(它只是不再阻塞)。

我在另一个应用程序中使用了完全相同的设置,它就像一个魅力:/

如果你们对造成所有这些麻烦的原因有任何想法,很高兴与您分享!

提前致谢。

4

1 回答 1

3
public void handleNewElement(MyService sender) {
    Log.d("NEW_ELEM","new element found");
    runOnUiThread(new Runnable(){
        public void run(){
            message_box.setText("new element found");
        }
    });
}
于 2012-11-09T10:34:14.570 回答