Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中对活动进行子类化时,是否有一种设计模式可以减少代码重复?_Java_Android_Design Patterns_Oop - Fatal编程技术网

Java 在Android中对活动进行子类化时,是否有一种设计模式可以减少代码重复?

Java 在Android中对活动进行子类化时,是否有一种设计模式可以减少代码重复?,java,android,design-patterns,oop,Java,Android,Design Patterns,Oop,我有一个共同的任务,我做一些活动-下载数据,然后显示它。我已经完全掌握了下载部分;当然,这有点棘手,因为用户可能会在下载完成之前更改方向或取消活动,但代码就在那里。有足够的代码处理这些情况,因此我不想将其复制/粘贴到我拥有的每个活动中,因此我想创建一个抽象的子类活动本身,以便它处理单个后台下载,然后启动一个用数据填充页面的方法 这一切都有效。问题是,由于单一继承,我被迫为任何其他类型的活动重新创建完全相同的类-例如,我使用Activity、ListActivity和MapActivity。对这三

我有一个共同的任务,我做一些活动-下载数据,然后显示它。我已经完全掌握了下载部分;当然,这有点棘手,因为用户可能会在下载完成之前更改方向或取消活动,但代码就在那里。有足够的代码处理这些情况,因此我不想将其复制/粘贴到我拥有的每个活动中,因此我想创建一个抽象的子类活动本身,以便它处理单个后台下载,然后启动一个用数据填充页面的方法

这一切都有效。问题是,由于单一继承,我被迫为任何其他类型的活动重新创建完全相同的类-例如,我使用Activity、ListActivity和MapActivity。对这三个类使用相同的技术需要三个重复的类,但每个类扩展不同的活动

是否有一种设计模式可以减少代码重复?就目前而言,我已经节省了很多重复工作,但在三个类中看到完全相同的代码却使我感到痛苦,因为它们都是不同类型活动的子类

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

假设我正在尝试解决方向更改期间异步任务后台下载的问题。我现在的解决方案是使用回调;我有一个下载管理器,它启动这些下载,然后我让活动附加一个回调。当方向改变时,活动被销毁,然后重新创建;在此过程中,我分离旧活动的回调,然后从新活动附加新回调


方向更改是一个常见问题,在多个活动中,我在加载数据时使用进度视图启动活动。我试图解决的是,不必重复十次执行这种定向处理逻辑;我最初的解决方案是将Activity子类化,但后来我遇到了上面的问题。

。无论什么是常见的,都可以委托给某些类,这些类可以是Activity、ListActivity和MapActivity的成员。

问题在于您混合了视图和程序的逻辑。 只要您的应用程序没有从系统中被终止,像线程一样的后台线程就会运行。您可以下载异步任务中的所有内容,然后将其保存在SD卡上的某个位置,以便在准备就绪的情况下从那里检索它

您可以将子类化为保存对任务的引用,或者保存处理程序以从每个活动与类通信


如果这根本不能解决你的问题,也许你可以稍微澄清一下这个问题。这将有助于了解您在onCreate中正在做什么。。。方法

我没有使用MapActivity,但我通过不使用ListActivity并在Activity中自己提供功能解决了这个问题。ListActivity中没有多少东西,如果你看的话:自己实现功能,你会得到更多的定制和更大的发展空间。

你有没有办法拥有一个带有静态方法的助手类,你可以将你的活动传递给它,并在那里而不是在每个活动中完成常见的工作?

我理解这个概念很好,但在这种情况下进行组合意味着代码复制的数量与在每个类中实现代码复制的数量差不多。每个类都必须实现onCreate()、onRetainOnConfigurationInstance()、onResume()、onPause()、onDestroy()并调用委托。对于我写的每一个活动,我不想考虑这个实现方面。我可能会被说服,但在这种情况下,构图会导致同样多的重复,除非我遗漏了什么。这表明android的活动太大,你可能无法控制。我想您可以编写一个DelegatingActivity,其中包含已经编写的函数(以及assignDelegate()或类似的函数),并从中继承。正如您到目前为止所描述的,与普通的Activity interclass相比,这并没有多大优势,但它可以在以后的过程中获得回报。Activities的工作方式是,它们具有在不同状态下调用的不同方法(例如“onCreate()”和“onDestroy()”)。当您实现自己的活动时,您可以对这些方法进行子cass和扩展,以定义行为。你的帖子给了我一个想法,那就是仍然要创建各种活动的多个子类,但是要让每个子类在其中实现一个委托;这样我就不会每次都实现相同的代码。尽管如此,我还是希望有一个稍微不那么混乱的解决方案。我将把这个标记为正确的,因为最终读到这篇文章会让我找到一个稍微不同(尽管仍然有点重复)的答案,这个答案的问题比以前少了。这不是一个完美的答案,但更好。我想你对我已经设置的内容有一个狭隘的看法。:)我已经编写了一个库,用于通过AsyncTask在后台下载,但是这样的库无法通过方向更改来解决活动破坏/重新创建等问题。当方向改变时,我必须能够将活动重新附加到已经在进行的下载中(在我的情况下,通过设置新回调)。我所说的减少重复的代码就是这段代码;每个活动都必须处理方向的更改,由于每个活动之间的代码相同,我只想重复使用。我仍然不明白您在所有onresume ondestroy等活动中都在做什么,也许您应该给出一些代码示例我考虑了您的解决方案,但根据docs MapActivity,不能以这种方式忽略:“地图视图只能由MapActivity构建(或膨胀)。这是因为它依赖于在后台访问网络和文件系统的线程;这些线必须由t引导