【问题标题】:Android - how to properly design and instantiate classes outside activity in order to access ctx/activity?Android - 如何正确设计和实例化 Activity 之外的类以访问 ctx/activity?
【发布时间】:2013-02-16 14:31:28
【问题描述】:

我的应用程序越来越大。

为了使其健壮,我决定将其拆分为活动之外的单独类,每个类代表一组活动功能。

问题是,我经常需要这些类中的上下文/活动变量。

这让我很困惑:

我应该“扩展” MainActivity 类,然后使用 parents() 获取 context/actvitiy 方法,还是应该使用 Context/Activity 变量实例化每个类,如下所示:

static private BrowseHandler instance;

static public void init(Context ctx, FragmentActivity ac) {
    if (null==instance) {
        instance = new BrowseHandler(ctx, ac);
    }
}
static public BrowseHandler getInstance() {
    return instance;
}

哪种方法更好?

或许,我错过了重点?我应该将我的活动代码保存在我的活动中吗?

【问题讨论】:

  • 除此之外,相关:我发现 Android 并没有像其他移动平台那样将“视图”和“控制器”职责分开,Activity 和 ListAdapters 最终塞满了低级视图操作代码。如果这是您的问题,请尝试创建专用的 View 类。如果你有例如ListView 的子视图及其根标签是RelativeLayout,只需继承RelativeLayout,将您的子类设为根标签,并将所有低级视图操作移至子类中。您的 listadapter 可以将其膨胀视图转换为正确的类型并在其上调用高级方法

标签: java android oop


【解决方案1】:

不要将Context 放在静态字段中。静态变量由类的所有实例共享,因此将上下文放在静态变量中会降低类的可重用性,因为它只能在一个上下文中使用。 (用于初始化静态字段的上下文)。

当您调用不在 Activity 中的代码时,将上下文作为方法参数传递。

关于您扩展 MainActivity 的想法......这似乎是一种奇怪的模式。将如何实例化它?

new MyExtendedMainActivity(this);

扩展 MainActivity 并没有真正的附加价值。唯一的缺点是:你不能扩展其他东西。此外,您将拥有 Android 操作系统无法处理的 Activity 对象。请记住,在 android 中,您永远不会自己实例化 Activity:android 框架会为您执行此操作,而您只有回调来配置它。

【讨论】:

  • 同意,将其作为方法参数传递是最简单的方法。坚持“托管”类,例如来自非托管类的 Activity 容易出错,最好完全避免。
  • 但是我没有在我的 sn-p 中显示 Context 变量。我的上下文不是静态的。你能评论一下关于“扩展” MainActivity 的部分吗?为什么这不起作用?
  • browserHandler是静态的,并且引用了Context(由于是构造函数arg,我假设它也是单例BrowserHandler的实例变量)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2022-10-24
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多