【问题标题】:n-1 async callback implementationn-1 异步回调实现
【发布时间】:2012-11-23 09:48:14
【问题描述】:

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

Callbacks
Broadcasts
Message Handlers

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

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

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

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

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

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

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

【问题讨论】:

    标签: android asynchronous


    【解决方案1】:

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

    我不明白为什么你不能在 android 上做你在 iOS 上做的事情。您将在 iOS 中有一个协议来定义要调用的函数,并且您可以在 Java/Android 中通过使用接口来执行相同的操作。

    在 iOS 中,你会得到类似的东西:

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

    在 Java 中你会:

    doStuffWithObject(SpecialStuff object) {}
    

    使用 SpecialStuff 作为您的协议或接口。 因为你在 android 中没有 performSelectorOnBackground,所以它的工作量更大。要么使用定时器,也许是一个单独的线程与处理程序结合使用,或者使用ASyncTask,这取决于什么最适合你以及异步任务有多大。

    ASyncTask 绝对值得研究。


    您当然也可以使用ObserverObservable

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

        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);
    }
    

    【讨论】:

    • 这个答案为我消除了很多疑问。感谢您的努力
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2014-06-09
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多