天天看點

單例模式-全局可用的 context 對象,這一篇就夠了

單例模式在各個方面都有着極為廣泛的使用,所謂單例,顧名思義就是整個程式中隻有一個該類的執行個體,是以它成功保證了整個程式的生命周期内該類的對象隻能建立一次,并且提供全局唯一通路該類的方法:getInstance()

使用

關于單例模式主要分為兩類:

  • 懶漢模式
  • 餓漢模式

由于餓漢模式是線程安全的,是以通常情況下,我們都盡量采用餓漢模式,具體原因常見這位大佬的博文:點選前往

本文主要結合 Android 分析下當例模式在 Android 中獲得全局可用的 Context 對象

搭建餓漢模式基本架構

單例模式基本方法包括

  • 一個該類對象
  • 該類構造方法
  • 獲得單例的方法
/**單例模式
 *
 * 向整個應用提供 App (application) 單例
 */
public class AppContext {

    private static AppContext instance;

    public AppContext(Context application){
        
    }

    public static AppContext getInstance() {
        if (instance == null){
            throw new RuntimeException();
        }
        return instance;
    }
}           

對外暴露執行個體化單例的方法

外界調用時,将全局的 context 對象傳入

public static void init(Context context){
        if (instance != null){
            throw new RuntimeException();
        }
        instance = new AppContext(context);
    }           

修改構造方法:

  • 将全局的 Context 對象儲存到該單例中
private Context applicationContext;

    public AppContext(Context application){
        this.applicationContext = application;
    }           

完整代碼

在之前的基礎上,暴露獲得 Context 對象的方法

/**單例模式
 *
 * 向整個應用提供 App (application) 單例
 */
public class AppContext {

    private static AppContext instance;

    private Context applicationContext;

    public AppContext(Context application){
        this.applicationContext = application;
    }

    public Context getApplicationContext() {
        return applicationContext;
    }

    public static AppContext getInstance() {
        if (instance == null){
            throw new RuntimeException();
        }
        return instance;
    }

    public static void init(Context context){
        if (instance != null){
            throw new RuntimeException();
        }
        instance = new AppContext(context);
    }

    public static boolean isInitialized(){
        return (instance != null);
    }
}           

單例的執行個體化

那麼我們如何生成該單例能,由于單例是全劇唯一的,根據這個特性我們一般在 Application 中執行個體化它

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        if (!AppContext.isInitialized()){
            AppContext.init(getApplicationContext());
        }
    }
}           

單例 context 的使用

context 的使用可以說非常廣泛,例如獲得程式網絡功能,獲得制定控件屬性等等,用途可以說是非常廣泛

  • 獲得網絡狀态
NetworkUtil.isNetworkAvailable(AppContext.getInstance().getApplicationContext()

public class NetworkUtil {
    /**
     * 檢查網絡是否可用
     *
     * @param context
     * @return
     */
    public static boolean isNetworkAvailable(Context context) {

        ConnectivityManager manager = (ConnectivityManager) context
                .getApplicationContext().getSystemService(
                        Context.CONNECTIVITY_SERVICE);

        if (manager == null) {
            return false;
        }

        NetworkInfo networkinfo = manager.getActiveNetworkInfo();

        if (networkinfo == null || !networkinfo.isAvailable()) {
            return false;
        }
        
        return true;
    }

}           
  • 在工具類中獲得控件屬性值
/**
     * color.xml裡面的id
     */
    public static int getColor(int colorResId){
        Context context = OrderContext.getInstance().getApplicationContext();
        return context.getResources().getColor(colorResId);
    }           

單例模式的使用非常廣泛,但具體的内容基本就這些,本文主要是我學習過程中的一點總結。

大家可以在此基礎上加以改造使用,如果有其他的應用場景,歡迎在評論區中分享,一起進步~!

繼續閱讀