【问题标题】:Static Utility class with Context/Activity - Android具有上下文/活动的静态实用程序类 - Android
【发布时间】:2013-03-17 02:45:18
【问题描述】:

在 Android 应用程序的开发过程中,我发现了一组实用程序类型的方法,这些方法已放入静态类中。所有这些方法都在多个 Activity 中使用,其中大多数不需要来自调用 Activity 的任何信息。

但是,我现在有一些方法需要 Activity 的 Context 以及需要 Activity 本身的方法。让我举例说明其中的一些:

  • getDeviceNaturalOrientation() - 使用 Activity 的 getWindow().getWindowManager().getDefaultDisplay() 来访问 显示旋转、宽度和高度以确定设备的 自然方向。
  • getDeviceOrientation() - 与上面类似,但获取当前 方向
  • createFile() - 使用上下文来访问一些资源(字符串)并 创建并展示一些 Toasts

现在,我对这个 Utils 类的主要问题是:

  1. 到目前为止,每个函数都采用一个 Context 参数,我从我正在使用的任何 Activity 传递该参数,但是可以在 Utils 类中创建一个静态 Context 或 Activity 变量并将其设置在每个 Activity 的开头(像在 onCreate 中)?此变量将用于任何需要 Context 或 Activity 实例的函数。
  2. 假设不推荐上述方法,是否可以将 Activity 参数传递给方法,或者是否有理由仅将 Activity 作为 Context 传递?我用于上述设备定向功能的方法是特定于 Activity 对象,而不是 Context,因此我要么作为 Activity 传递,要么作为 Context 传递并转换为 Activity(后者听起来很糟糕)。

另外,我非常愿意接受这个 Util 类可能不适用于这些需要 Context/Activity 的方法的想法,因此我欢迎仍然会阻止在每个活动类中复制这些方法的替代方法使用它们。

【问题讨论】:

    标签: android android-activity utilities


    【解决方案1】:

    1) 到上下文的静态链接可能会导致内存泄漏。这意味着对 Activity 的引用即使在被销毁后仍将保留在静态变量中,因此 Activity 的所有内存及其所有视图都将保持有效并且不会被 gc 清除。您可以这样做,但您必须小心在完成后将变量清空。最好只是避免它。

    2)将活动作为活动传递有点尴尬,但没有技术理由不这样做。那时我们正在争论代码的清洁度/可维护性。有时非清洁解决方案更容易。当然,在上述情况下,我宁愿将方向/显示/资源对象传递给函数,也不愿传递整个上下文或制作特殊的访问器。

    【讨论】:

    • 谢谢您,我已接受您的回答。我最终基本上保持原样,但我确实更改了一些方法以仅接收 Resources/FragmentManager/etc... 根据需要而不是完整的上下文。它增加了参数的数量,但我想更少的事情可能会出错。再次感谢。
    【解决方案2】:

    我认为当您从 Activity 调用时,以下设计应该没问题

    MyUtility utility=new MyUtility();
    utility.getDeviceNaturalOrientation(this);
    utility.getFile(this);
    

    你可以像这样定义这些函数

    public int getDeviceNaturalOrientation(Activity activity){
     //code
    return some_oreientation
    }
    

    像这样

    public File getFile(Context context){
     //code
    //return file handler
    }
    

    Activity 是 Context 的子类,因此您甚至可以将设计更改为跟随

    MyUtility utility=new MyUtility(this); //this refer to Activity
    utility.getDeviceNaturalOrientation();
    utility.getFile();
    

    只要您通过活动就可以了,但是如果您按照活动进行操作,则第一个方法调用会出错

    MyUtility utility=new MyUtility(getApplicationContext());
    utility.getDeviceNaturalOrientation(); //will throw exception
    utility.getFile();
    

    而且,是的,第一个想法不是推荐的方式。

    【讨论】:

    • 感谢您的回复。然而,实际上没有什么可以保证这个 Utility 类是非静态的和实例化的。除此之外,您所描述的几乎就是我已经在做的事情。不过,您的最后一点确实提出了另一个想法。我在网上看到的一半示例将传递 Activity 和 getApplicationContext() 视为可互换的。到目前为止,在我的应用程序中,我从未使用过后者,而且一切都很好,即使在我自己使用 getApplicationContext() 的示例上也是如此。这不只是在你创建一个 Application 类的时候吗?
    • 应用程序上下文附加应用程序生命周期和活动上下文与活动生命周期。所以你不应该用应用程序上下文创建一个对话框,你应该用活动上下文来做。
    【解决方案3】:

    我建议你发送WeakReference of your ActivitygetApplicationContext()(对于那些可以使用它的作品)并且不要使用static method,因为它会导致内存泄漏Read Developer blog还有

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2023-03-08
      • 2014-06-18
      相关资源
      最近更新 更多