[英]Handling common code between different activities, fragments, tasks, etc
我对Java和其他语言的面向对象编程有相当(不是太多,但有一些)经验,但是对于Android来说还是一个新手,我对所有不同类的理解充其量只能描述为有限的 (更现实的是困惑 )。
我正在创建一个目前由一个活动和一个小部件组成的应用程序。 它的功能之一就是从互联网上获取一些数据。 这些数据每天只会在任意时刻改变,因此无需每次启动应用程序或查看小部件时都获取此数据。
我的问题是,我想有一种方法来获取数据并将其存储在共享的首选项中,以及更新时间(以便每天仅更新一次)。 必须从小部件和活动中访问此方法。
通常,我只会使用静态方法创建一些类来执行此操作。 但是,要访问共享的首选项,您需要一个Context
。 我可以提出两种方法:
Context
作为参数 public class MyClass {
public static String fetchData(Context context) {
return // ...
}
}
public class MyClass {
private static MyClass instance = null;
private Context context;
public MyClass(Context context) {
this.context = context;
}
public String fetchData() {
return ...;
}
public static MyClass getInstance(Context context) {
if (instance == null)
instance = new MyClass(context);
return instance;
}
public static MyClass getInstance() {
return instance;
}
}
现在,我将在第一次使用MyClass.getInstance(getActivity()).fetchData()
调用它,然后再MyClass.getInstance().fetchData()
。
这些方法中的任何一个都比其他方法更可取吗?如果是,为什么? 还是有另一种更好的方法来做这种事情? 还是取决于情况(在那种情况下,具体取决于什么?)?
稍后,我可能会使用更多这些方法。 由于上下文通常不会改变,因此我认为单例在这里可能有用,因为在第一个实例化之后,您不再需要提供上下文。
选项1几乎可以一直使用。 选项2很危险,因为您要保留对Context
的引用。 如果Context
是Activity
类型,则可能会发生内存泄漏-您引用的Activity
将不是GC
如果使用的是选项2,请确保使用的是Application Context
。
要初始化单例,请执行以下操作:
getInstance(myActivity.getApplicationContext())
如果方法是一种实用程序方法,则选项1会好得多-该方法可以执行某些操作,并且不需要在方法返回后更改其状态。
首先,您没有保留对Context
的引用。 您也不需要在内存中保持单例。 最后的静态方法是有效的 。
如果您一直在使用Singleton并在此过程中重新创建对象,请使用选项2( Picasso , RetroFit是满足Singleton需求的很好的例子)
Android Volley库是何时使用Singleton的一个很好的例子。 它也与从远程获取数据有关,因此请看一下
本质上,您最初描述的方法都不需要使用任何方法。
我正在创建一个目前由一个活动和一个小部件组成的应用程序。 它的功能之一就是从互联网上获取一些数据。 这些数据只会在每个午夜改变,因此无需每次启动应用程序或查看小部件时都获取此数据。
那么,每天的下载到底由什么负责?如何触发呢? Activity
和应用小部件都不适合。
添加一些点点滴滴-使用AlarmManager
在午夜左右创建一个重复警报集(虽然不准确,但通常会在几秒钟之内)。 让警报触发由BroadcastReceiver
接收的BroadcastReceiver
,然后让接收器启动IntentService
以下载并保存所需的内容。
这是双赢的方案。 无论您的应用程序是否“正在运行”(或手机是否处于睡眠状态),都会发出警报。 接收器将被触发,并且IntentService
使用其自己的工作线程,因此无需担心在主/ UI线程上运行网络代码时会遇到任何问题。 另外, IntentService
具有一个Context
,可用于访问SharedPreferences
并且在完成工作后将自行关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.