n-1异步回调实现

dub*_*eat 6 android asynchronous

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

Callbacks
Broadcasts
Message Handlers
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

关于回调和处理程序的1-1关系是否正确?

MrJ*_*Jre 2

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

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

在 iOS 中你会看到类似这样的东西:

doStuffWithObject:(NSObject<SpecialStuff> *)object {}
Run Code Online (Sandbox Code Playgroud)

而在 Java 中你会:

doStuffWithObject(SpecialStuff object) {}
Run Code Online (Sandbox Code Playgroud)

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

ASyncTask 绝对值得研究。


您当然也可以使用ObserverObservable

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

    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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的监听器界面类似于Observer

public interface TimeListener {
    void onTimeUpdate(long time);
}
Run Code Online (Sandbox Code Playgroud)