繁体   English   中英

处理不同活动,片段,任务等之间的通用代码

[英]Handling common code between different activities, fragments, tasks, etc

我对Java和其他语言的面向对象编程有相当(不是太多,但有一些)经验,但是对于Android来说还是一个新手,我对所有不同类的理解充其量只能描述为有限的 (更现实的是困惑 )。

我正在创建一个目前由一个活动和一个小部件组成的应用程序。 它的功能之一就是从互联网上获取一些数据。 这些数据每天只会在任意时刻改变,因此无需每次启动应用程序或查看小部件时都获取此数据。

我的问题是,我想有一种方法来获取数据并将其存储在共享的首选项中,以及更新时间(以便每天仅更新一次)。 必须从小部件和活动中访问此方法。

通常,我只会使用静态方法创建一些类来执行此操作。 但是,要访问共享的首选项,您需要一个Context 我可以提出两种方法:

选项1:静态方法, Context作为参数

public class MyClass {
    public static String fetchData(Context context) {
        return // ...
    }
}

选项2:单身人士

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的引用。 如果ContextActivity类型,则可能会发生内存泄漏-您引用的Activity将不是GC

如果使用的是选项2,请确保使用的是Application Context

要初始化单例,请执行以下操作:

getInstance(myActivity.getApplicationContext()) 

如果方法是一种实用程序方法,则选项1会好得多-该方法可以执行某些操作,并且不需要在方法返回后更改其状态。

首先,您没有保留对Context的引用。 您也不需要在内存中保持单例。 最后的静态方法是有效的

如果您一直在使用Singleton并在此过程中重新创建对象,请使用选项2( PicassoRetroFit是满足Singleton需求的很好的例子)

Android Volley库是何时使用Singleton的一个很好的例子。 它也与从远程获取数据有关,因此请看一下

本质上,您最初描述的方法都不需要使用任何方法。

我正在创建一个目前由一个活动和一个小部件组成的应用程序。 它的功能之一就是从互联网上获取一些数据。 这些数据只会在每个午夜改变,因此无需每次启动应用程序或查看小部件时都获取此数据。

那么,每天的下载到底由什么负责?如何触发呢? Activity和应用小部件都不适合。

添加一些点点滴滴-使用AlarmManager在午夜左右创建一个重复警报集(虽然不准确,但通常会在几秒钟之内)。 让警报触发由BroadcastReceiver接收的BroadcastReceiver ,然后让接收器启动IntentService以下载并保存所需的内容。

这是双赢的方案。 无论您的应用程序是否“正在运行”(或手机是否处于睡眠状态),都会发出警报。 接收器将被触发,并且IntentService使用其自己的工作线程,因此无需担心在主/ UI线程上运行网络代码时会遇到任何问题。 另外, IntentService具有一个Context ,可用于访问SharedPreferences并且在完成工作后将自行关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM