單例模式-全局可用的 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);
    }

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM