【问题标题】:Should I use a listener interface or handler for event callbacks in Android development?我应该在 Android 开发中为事件回调使用侦听器接口或处理程序吗?
【发布时间】:2011-05-10 14:32:22
【问题描述】:

我是 Java 新手,我正在移植我们的 Windows Phone 7 库以在 Android 上运行。由于语法相似,到目前为止,这非常简单。我们的库基本上是一个抽象的 http 消息队列,可在移动平台上提供数据持久性和完整性。它只提供异步方法,这是一种设计选择。在 WP7 上,当异步消息已处理并收到服务器响应时,我使用委托来调用用户提供的回调。

为了在 Android 上实现同样的事情,到目前为止我已经找到了两种方法 - 一个简单的 Java 侦听器接口,其中包含用户必须实现的 OnSuccess 和 OnFailure 方法,或者使用在线程之间提供消息队列的 Android 处理程序类( http://developer.android.com/reference/android/os/Handler.html)。

我在这个阶段使用了 Handler,老实说,它与 C# 委托最相似。对于我们库的用户来说,实现它的工作似乎也更少。使用我们的库的一些用户代码示例:

connection.GetMessage("http://somerestservice.com", GetCallback);

Handler GetCallback = new Handler() {
    public void handleMessage(Message message){
        CustomMessageClass customMessage = (CustomMessageClass)message.obj;

        if(customMessage.status == Status.Delivered) {
           // Process message here, 
           // it contains various information about the transaction 
           // as well as a tag that can contain a user object etc. 
           // It also contains the servers response as a string and as a byte array.
        }
    }
};

使用它,用户可以创建任意数量的不同处理程序,调用任何他们想要的,并将它们作为方法参数传递。非常类似于委托...

我想知道我是否应该转向侦听器接口的原因是因为我对 Java 的了解越多,它似乎就是它的完成方式以及使用我们库的第三方期望它完成的方式。

这本质上是相同的过程,除了每次你想对服务器响应做不同的事情,即你可能从不同的端点获取不同类型的数据,你将不得不创建一个自定义类来实现我们的接口每次,以及实现我们接口的任何方法。或者,当然你可以有一个单一的整体类,所有服务器响应都汇集到其中,但尝试弄清楚如何处理每个单独的响应很有趣......

由于来自 C#,我可能有点偏颇,但听者似乎有点令人费解,我更喜欢处理程序的实现,有没有 Java 开发人员有任何想法/建议?将不胜感激。

干杯!

【问题讨论】:

  • 我自己是Java和Android的新手,所以我没有资格完整回答,但我的理解是监听器和处理程序的定义有点模糊,尤其是跨平台。在 Android 开发指南的 UI event section 中,它们将侦听器描述为您绑定到视图上特定事件的对象。您可以在外部执行此操作,而不必扩展视图对象。而他们将处理程序描述为 View 类的标准方法,您在扩展它时会覆盖这些方法。

标签: c# java android windows-mobile


【解决方案1】:

我不认为你有什么编译..你需要在使用之前定义处理程序实现吗?

但就您问题的实质而言,如果您确实想要为每个响应使用不同的处理程序实现,那么您拥有的 api 似乎还不错。

如果所有消息都以相同的方式处理,我将使用侦听器模式,或者不同的处理方式仅取决于消息中的内容,在进行getMessage 调用时无法确定。

顺便说一句,Java 函数和变量名通常以小写字母开头。只有类名以大写字母开头。

【讨论】:

  • 在我将处理程序实现作为方法参数传递后,它编译得很好,可能是 Eclipse 在幕后做了一点魔术? :) 我认为对我们库的每次调用都有不同的回调应该尽可能简单的原因仅仅是因为我们预计库的用户要处理的不同端点和数据的数量。例如,一个端点可能包含用户对象,另一个端点可能包含他们的约会,另一个端点可能包含他们的联系人——所有不同的数据结构都需要以不同的方式进行处理。
【解决方案2】:

使用接口方法的好处是松耦合。这样,任何实现您的接口的类都不应该知道(或受其影响)在其他地方进行的任何线程管理,并且可以在其范围内适当地处理结果对象。

顺便说一句,我是 AsyncTask 的忠实粉丝。你试过用吗?

【讨论】:

  • 感谢 Brandon,我已经切换到使用接口,现在我已经实现了它实际上感觉比处理程序更干净 ;) - AsyncTasks 看起来很棒,虽然我们没有在内部使用它们我们只是以老式的方式开始新线程。尽管所有服务器响应都在 UI 线程上返回,所以我想如果服务器响应需要任何类型的后期处理,大多数使用这个库的人都会使用 AsyncTasks。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多