[英]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.