2010-04-06 51 views
5

我有一个共同的任务,我做了一些活动 - 下载数据,然后显示它。我已经下载了下载部分;当然,由于在下载完成之前用户可能会改变方向或取消活动,但代码已存在,这有点棘手。有足够的代码处理这些情况,因此我不想将其复制/粘贴到每个活动中,因此我想创建一个抽象子类活动本身,以便它处理单个后台下载,然后启动一个方法用数据填充页面。在Android中进行子类化活动时,是否有设计模式可以减少代码重复?

这一切正常。问题是,由于单一继承,我不得不为任何其他类型的Activity重新创建完全相同的类 - 例如,我使用Activity,ListActivity和MapActivity。对所有三种使用相同的技术需要三个重复的类,除了每个类都扩展一个不同的Activity。

有没有可以减少代码重复的设计模式?就目前而言,我已经节省了大量的重复,但是我很难在三个类中看到完全相同的代码,这样每个代码都可以划分出不同类型的Activity。

编辑:因为它似乎我需要更具体一点...

假设我想在方位的变化,解决了的AsyncTask后台下载的问题。我现在的解决方案是使用回调;有我开始下载的下载管理器,然后我有Activity附加一个回调。当方向改变时,活动被销毁并重新创建;在此过程中,我分离旧的Activity的回调,然后在新的活动中添加新的回调。

方向更改是一个常见问题,并且在多个活动中,我会在数据加载时以进度视图开始活动。我试图解决的是不必重新执行这个方向处理逻辑十次;我最初的解决方案是子类化的活动,但后来我得到了上述问题。

回答

3

Prefer composition over inheritance。无论什么是常见的,委托给一些可以是Activity,ListActivity和MapActivity成员的类。

+0

我完全理解这个概念,但在这种情况下进行组合就意味着就像在每个类中实现它一样多的代码重复。每个类都必须实现onCreate(),onRetainNonConfigurationInstance(),onResume(),onPause(),onDestroy()并调用委托。我宁愿不必为我写的每个活动考虑这个实现方面。除此之外,我可以说服其他人,但在这种情况下,合成会导致同样多的重复,除非我错过了某些东西。 – 2010-04-06 18:13:44

+0

Ick。这表明Android的活动太大,你可能无法控制。我想你可以用已经写好的函数(和assignDelegate()或其他)编写DelegatingActivity,并从中继承。正如你迄今为止所描述的那样,它与普通的Activity类相比没有多大优势,但它可以在后面付清。 – 2010-04-06 18:19:56

+0

活动的工作方式是他们有不同的方法,在不同的状态下被调用(例如“onCreate()”和“onDestroy()”)。当你实现你自己的Activity时,你可以细分和扩展这些方法来定义行为。 你的文章给了我一个想法,它仍然创建各种活动的多个子类,但要让每个实现一个委托在其中;这样我就不会每次都执行相同的代码。尽管如此,我还是希望能够稍微减少混乱的解决方案。 – 2010-04-06 18:27:55

0

问题是,您正在混合视图和程序的逻辑。 只要应用程序不会从系统中消失,后台线程就会像AsyncTask一样运行。您可以在异步任务中下载所有内容,然后将其保存在SD卡的某个位置,以便在该位置准备就绪时从该位置取回。

您可以继承application class以保存对任务或处理程序的引用,以便与每个活动的类进行通信。

如果这不是你的问题的解决方案,也许你可以澄清一点问题。这将有助于知道你在做什么onCreate ...方法。

+0

我认为你已经对我已经设置的内容有了一个狭隘的看法。 :)我已经编写了一个通过AsyncTask在后台下载的库,但是这样的库不能解决通过定位更改导致的活动破坏/娱乐等问题。当方向改变时,我必须能够将活动重新附加到正在进行的下载中(在我的情况下,通过设置新的回调)。我正在谈论的减少重复的代码是这个代码;每个活动必须处理方向更改,并且因为它们是我想要重用的每个活动之间的相同代码。 – 2010-04-06 19:18:19

+0

我还没有得到你所做的所有onresume ondestroy等活动,也许你应该给一些代码示例 – Janusz 2010-04-06 19:32:43

0

我还没有使用MapActivity,但我解决了这个问题,不使用ListActivity并在Activity中自己提供了这些功能。在ListActivity中确实没有那么多,如果你看起来:http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/app/ListActivity.java自己实现这个功能,你可以获得更多的定制和更多的增长空间。

+0

我想过你的解决方案,但根据文档MapActivity不能以这种方式忽略:“一个MapView只能由MapActivity构造(或夸大),这是因为它依赖于在后台访问网络和文件系统的线程;这些线程必须由MapActivity中的生命周期管理来管理。 (http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html) – 2010-04-06 20:29:49

+0

corect,我面临同样的问题,而不是我使用的ListAcivity我的OwnActivity与一些实现,但与MapActivity我所能做的就是复制粘贴。 我最终使用的解决方案,不是因为它非常干净,而是因为它集中代码在一个地方是为我的基本活动需求(在你的情况下onDownloadFinish,onDetachListener,onAttachListener等...)使用一个接口,并有一个委托类实现这些方法,然后每个需要该行为的活动也将实现该接口并将所有调用委托给该对象... – codeScriber 2011-07-10 11:21:33

0

任何方式让你有一个助手类与静态方法,你会传递你的活动,并有共同的工作在那里而不是在每个活动中完成?

+0

目前我有类似这样的设置,虽然我所做的事情的性质必须是实例化对象不是静态方法。但是,此解决方案仍然意味着您必须在每个要使用此功能的活动中重写相同的代码,或者必须对每种类型的活动进行子类化以减少代码重复。 – 2010-04-06 21:29:37

相关问题