n-1异步回调实现

6

我正在将一款IOS应用重写为安卓应用。这是我为了学习安卓而设定的任务。 在学习安卓期间,我正在了解不同的异步消息传递选项。到目前为止,我发现了以下选项:

Callbacks
Broadcasts
Message Handlers

我正在尝试决定哪种方法最适合我的目的。在我的IOS应用程序中,我有10个屏幕对象和1个协调器对象。这是我的n-1。

目前我的ios工作方式是我的屏幕对象调用协调器中的工作方法,并将其自身作为委托传递。协调器执行一些异步工作,并在完成/失败时调用委托上的各种方法:完成/失败原因等等。

多个屏幕对象可以同时请求执行工作。

到目前为止,我觉得在Android中回调/消息处理程序的方法更像是1对1的关系。

我倾向于使用本地广播管理器。这似乎更像是NSNotification而不是委托方法,但似乎是为n-1关系而设计的。

广播管理器是实现n-1异步工作的最佳方法吗?

另外,我的回调和处理程序之间的1对1关系的假设是否正确?

1个回答

2

您确实可以像使用NSNotification一样使用广播,但我通常会使用广播在我的应用程序的不同部分之间传递消息,例如在服务和活动之间进行通信,而不是在特定部分内部进行通信。

我不明白为什么您不能在Android上像在iOS上那样做。在iOS中,您将拥有定义要调用哪些函数的协议,并且您可以通过使用接口在Java / Android中执行相同的操作。

在iOS中,您将拥有类似于:

doStuffWithObject:(NSObject<SpecialStuff> *)object {}

如果使用Java,你需要:

doStuffWithObject(SpecialStuff object) {}

如果SpecialStuff是您的协议或接口,因为在Android中没有performSelectorOnBackground,所以需要更多的工作。可以使用计时器,也可以结合处理程序在单独的线程上运行,或者根据异步任务的大小使用ASyncTask

值得一提的是,ASyncTask绝对值得探究。


当然,您也可以利用ObserverObservable

以下是一个简单的示例,其中包含一个处理程序和一个计时器,每秒通知其监听器一个新时间(请注意,在这种情况下,处理程序是在主线程上创建的,这样您就可以像在iOS中使用performSelectorOnMainThread一样发送消息回来):

    class SomeExample {

    private final ArrayList<TimeListener> timeListeners;

    private final Handler handler = new Handler();
    private final TimeUpdateRunnable timeUpdateRunnable = new TimeUpdateRunnable();

    public SomeExampleView {

        timeListeners = new ArrayList<TimeListener>();

        updateTimer = new Timer("General Update Timer");

        TimeUpdateTask timeUpdateTask = new TimeUpdateTask();
        updateTimer.scheduleAtFixedRate(timeUpdateTask, (60 * 1000) -   (System.currentTimeMillis() % (60 * 1000)), 60 * 1000);
    }

    public void addTimeListener(TimeListener timeListener) {
        timeListeners.add(timeListener);
    }

    public boolean removeTimeListener(TimeListener timeListener) {
        return timeListeners.remove(timeListener);
    }


    class TimeUpdateTask extends TimerTask {
        public void run() {
            handler.post(timeUpdateRunnable);
        }
    }

    private class TimeUpdateRunnable implements Runnable {
        public void run() {
            for (TimeListener timeListener : timeListeners) {
                timeListener.onTimeUpdate(System.currentTimeMillis());
            }
        }
    }
}

我的监听器接口类似于Observer

public interface TimeListener {
    void onTimeUpdate(long time);
}

这个回答消除了我很多的疑虑。感谢你的努力。 - dubbeat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接