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

單例模式在各個方面都有着極爲普遍的使用,所謂單例,顧名思義就是整個程序中只有一個該類的實例,因此它成功保證了整個程序的生命週期內該類的對象只能建立一次,而且提供全局惟一訪問該類的方法:getInstance()java


使用

關於單例模式主要分爲兩類:安全

  • 懶漢模式
  • 餓漢模式

因爲餓漢模式是線程安全的,因此一般狀況下,咱們都儘可能採用餓漢模式,具體緣由常見這位大佬的博文:點擊前往網絡

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


搭建餓漢模式基本框架

單例模式基本方法包括框架

  • 一個該類對象
  • 該類構造方法
  • 得到單例的方法
/**單例模式
 *
 * 向整個應用提供 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 對象傳入ide

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 中實例化它this

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);
    }

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

你們能夠在此基礎上加以改造使用,若是有其餘的應用場景,歡迎在評論區中分享,一塊兒進步~!

相關文章
相關標籤/搜索