簡體   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