n-1异步回调实现

时间:2012-11-23 09:48:14

标签: android asynchronous

我正在用android编写一个IOS应用程序。这是我设定尝试学习android的任务。 在android我正在学习不同的异步消息传递选项。到目前为止我发现的是:

Callbacks
Broadcasts
Message Handlers

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

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

多个屏幕对象可以请求同时完成工作。

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

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

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

我对回调和处理程序的1-1关系的假设也是正确的吗?

1 个答案:

答案 0 :(得分:2)

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

我不明白为什么你不能完全按照你在Android上的iOS做的那样做。您可以在iOS中使用协议来定义要调用的函数,并且可以使用接口在Java / Android中执行相同的操作。

在iOS中你会有类似的东西:

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

在Java中你会有:

doStuffWithObject(SpecialStuff object) {}

将SpecialStuff作为您的协议或接口。 因为你在android中没有performSelectorOnBackground它的工作量更多。要么使用Timers,也许使用单独的Thread与Handlers结合使用,或者使用ASyncTask,具体取决于最适合您的方式以及异步任务的大小。

ASyncTask绝对值得研究。


您当然也可以使用ObserverObservable

一个带有处理程序和计时器的简单示例,它每秒向其侦听器通知一个新时间(请注意,在这种情况下,处理程序是在主线程上创建的,这样您就可以发回类似于使用{{1在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