java - 在 Android Java 中设计一个库

标签 java android oop

<分区>

我正在 Android 中开发一个库,为应用程序提供基本的渲染功能。我的目标是读取 GLSurfaceView 上的触摸输入(库拥有此 glsurfaceview 的所有权),计算一些值并返回到应用程序,然后应用程序将根据收到的参数执行操作。可以将其可视化为库向应用程序引发的中断。 为了实现这一点,我必须在客户端强制执行某种机制,以便库可以通知事件,客户端可以使用参数执行他想要的操作。可能的构造之一可以使用接口(interface),但由于库不会有实例应用程序 Activity ,它不能调用必要的功能。

这里最合适的机制是什么?

最佳答案

这里有两个部分需要考虑:输入和输出。

用户输入

如果您的库需要处理的事件映射到 Android 事件,我会使用类似于一些现有库所使用的方法,即复制方法名称和签名并返回一个 boolean 值 指示调用是否已被处理的值。

为此,创建一个类作为您的库和用户 Activity 之间的桥梁,并定义以下方法:

public boolean onKeyDown (int keyCode, KeyEvent event) {
    // Handle here the key event in the appropriate way
    // if the pressed key was not to be handled by your library, simply return false
    // else, handle it and return true
}

然后,在调用者 Activity 中,覆盖相同的方法并适本地调用它

// We assume your bridge class is already instantiated and called `bridge`
@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);

    if (bridge.onKeyDown(keyCode, event)) {
        return true;
    }

    // User code for other keys here
}

将此模式扩展到其他方法,包括 onStart 以及必要时的类似方法。这已被一些 Android 支持实用程序使用,例如 onOptionsItemSelected 中的 Action Bar Drawer Toggle。我个人在我的Helpers 中使用了这种模式并且效果很好。

数据输出

根据您正在执行的处理类型,您可能希望通过桥类方法或使用监听器直接发布结果。

如果计算速度很快并且需要经常但不是总是,那么使用get 方法可能是有益的:

public Object getResult () {
    // Use an appropriate return type and method name
}

但是,如果结果在单独的线程中执行,因为它们很慢或者它们将只使用一次,在处理它们时,最好使用 Callbacks 类型的接口(interface),类似于 Loaders 框架中的接口(interface)。

在您的桥接类中,定义如下接口(interface):

public class Bridge {

    interface Callbacks {
        void onSomeResultComputed (Object result);
        void onSomeOtherResultComputed (Object result);
        // etc.
    }

    // Other methods and fields
}

然后让客户端使用特定方法或使用遵循上述模式的 onCreate 注册此回调。客户端代码看起来像这样

public class SomeActivity implements Bridge.Callbacks {

   [...]

   @Override
   protected void onCreate () {
       super.onCreate();
       bridge.onCreate(this);
   }

   [...]

   @Override
   public void onSomeResultComputed (Object result) {
       // Handle the result here
   }

   @Override
   public void onSomeOtherResultComputed (Object result) {
       // Handle the result here
   }
}

同样,Google 已经在一些 Android 实用程序(例如 Loaders)和一些 Google Play 服务类中使用了这种模式,并且效果很好。

请记住,在监听器的情况下,要在并行线程中执行昂贵的计算(可能使用 AsyncTask)并始终在主线程中再次调用 Callbacks 方法。

关于java - 在 Android Java 中设计一个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19632995/

相关文章:

java - 在 Selenium 中验证视口(viewport)中的元素

android - 使用 Android 数据绑定(bind)时,如何通过 xml 为自定义 setter 传递多个参数

java - 更新 TextView

java - View - 没有零参数构造函数

c# - 在 VB.NET 与 C# 中实现属性的多级继承

java - 使用迭代器在 HashMap 中搜索特定值

java - akka 和流输出

java - 使用隐式向下转换调用方法

设置 "user.dir"时 Java : File. exists() 不一致

java - 使用正确的 OOP 模式在 Java 中构建游戏