8

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

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

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

现在,我关于这个 Utils 类的大问题是:

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

另外,我非常愿意接受这个 Util 类可能不是这些需要 Context/Activity 的方法的方法,所以我欢迎那些仍然阻止在使用它们的每个活动类中复制这些方法的替代方法.

4

3 回答 3

4

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

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

于 2013-03-27T04:36:44.597 回答
0

我认为当您从 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();

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

于 2013-03-27T04:53:50.877 回答
0

我建议你发送一个WeakReference of your Activityor getApplicationContext()(对于那些可以使用它的作品)并且不要使用static method,因为它会导致内存泄漏。也阅读开发者博客

于 2015-03-12T09:01:41.193 回答