静态内部类
推荐使用


/*** 静态内部类*/
public class Singleton {public Singleton(){}private static class Singlentoninstense{private static final Singleton INSTANCE=new Singleton();}public  static Singleton getInstance(Context context){Toast.makeText(context, "sssss", Toast.LENGTH_SHORT).show();return Singlentoninstense.INSTANCE;}
}

优点
在类第一次加载的时候进行初始化,所以虚拟机保证了线程的安全,再类进行初始化的时候别的先线程无法进入

使用场景
需要频繁的进行创建与销毁的对象
创建对象是耗时过多或者消耗资源过多,但是又经常用到的对象
工具类对象
频繁访问数据库或者文件的对象

饿汉式单利模式

 /*** 饿汉式(静态长量)*/private final  static Singleton INSTANCE=new Singleton();private Singleton(){}private static Singleton getInstance(){return INSTANCE;}

优点
这种写法很简单,再类装载的时候就进行初始化,避免了线程同步的问题;
缺点
在类装载的时候就进行初始化,没有起到Lazy Loading的效果,如果从始至终没有使用过这个实例,则回造成内存浪费(如果用静态代码块的方式优点和缺点一样,只不过将实例方到静态代码块中)

懒汉式单利模式

    /**** 懒汉式(线程不安全)*/private static Singleton singleton;private Singleton(){}private static Singleton getInstance(){if (singleton==null){singleton=  new Singleton();}return singleton;}
}

优点
这种写法起到了Lazy Loading的效果
缺点
这种写法只能在单线程模式下使用,如果多线程模式下一个线程进入了if(singleton==null)判断语句,还没有来得及执行其他线程就已经通过了这个判断语句,这个时候就会产生多个实例,所以多线程模式下不实用这个方式

双重检查锁单利模式(推荐使用)

 /**** 双重检查锁
*/private static volatile Singleton singleton;private  Singleton(){}private static Singleton getInstance(){if (singleton==null){synchronized (Singleton.class){if (singleton==null){singleton =new Singleton();}}}return singleton;}

首先说一下volatile 不说我也忘了
第一点就是保证此变量对所有的线程的可见性,这里的“可见性”,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。
第二点禁止指令重排序优化。(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)
优点
这种方式线程安全,延迟加载,效率较高, 他进行了两次if(singleton==null)检查这样保证了线程安全这样实例化代码只执行一次后面再次访问时进行判读然后直接return实例化对象

枚举
这里就不进行推荐了
备注:Android整体不推荐枚举类型,因为占用内存过大,所以第八种枚举类型不可使用。

下面可不看------------------------------------------------------------------------------------

public class ResultUtils {private ResultBeanDao dao;private ResultUtils() {}private static ResultUtils mResultUtils = null;public static ResultUtils getResultUtils() {synchronized (ResultUtils.class) {if (mResultUtils == null) {mResultUtils = new ResultUtils();}}return mResultUtils;}//一定要记得初始化public void init(Context context) {DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "result");SQLiteDatabase db = helper.getWritableDatabase();DaoMaster daoMaster = new DaoMaster(db);dao = daoMaster.newSession().getResultBeanDao();}/*1  72  634567* *///添加public void add(ResultBean bean) {List<ResultBean> list = dao.loadAll();for (int i = 0; i < list.size(); i++) {ResultBean bean1 = list.get(i);if (bean.getCommodityId() == bean1.getCommodityId()) {dao.delete(bean1);}}dao.insert(bean);}//查询全部public List<ResultBean> loadAll() {List<ResultBean> listTemp=new ArrayList<>();List<ResultBean> list = dao.loadAll();for (int i = 0; i <list.size() ; i++) {ResultBean bean= list.get(i);listTemp.add(0,bean);}return listTemp;}
}

可能会产生多个实例

有些时候在软件开屏的时候就会出现网络请求弹出AlertDialog就会出现AlertDialog重叠的现象
我们可以用单利模式进行设置AlertDialog 上代码


public class MSDialogManager  {private static MSDialogManager msDialogManager = new MSDialogManager();private AlertDialog alertDialog;private TextView textView;String url = "https://yooul.com/yooul.apk";private TextView tv_cancel;private LinearLayout lin_text;private TextView tv_update;private TextView update_title;public static MSDialogManager newInstance() {return msDialogManager;}public void showDialog(Context context, int upgrade_type, String upgrade_point, String app_version) {if (alertDialog == null) {AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.dialogs);View view = View.inflate(context, R.layout.update_dialog, null);builder.setView(view);alertDialog = builder.create();/*alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialogInterface) {alertDialog = null;}});*/final RxPermissions rxPermissions = new RxPermissions((Activity) context);rxPermissions.request(Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Action1<Boolean>() {@Overridepublic void call(Boolean granted) {if (granted) { // 在android 6.0之前会默认返回true} else {}}});tv_update = view.findViewById(R.id.tv_update);lin_text = view.findViewById(R.id.lin_text);tv_cancel = view.findViewById(R.id.tv_cancel);update_title = view.findViewById(R.id.update_title);TextView tv_info = view.findViewById(R.id.tv_info);tv_info.setText("新版本v"+app_version);//取消更新的按钮tv_cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertDialog.dismiss();}});tv_cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertDialog.dismiss();}});//版本更新词条String upgrade_points="1.优化细节和体验,更加稳定\n2.引入大量优质用户\n3.修复已知问题\n4.风格修改";if (upgrade_point!=null){update_title.setVisibility(View.VISIBLE);lin_text.setVisibility(View.GONE);update_title.setText(upgrade_point.replace("\\n", "\n"));}else {update_title.setVisibility(View.GONE);lin_text.setVisibility(View.VISIBLE);List<String> listtag = new ArrayList<>();listtag.add("1.优化细节和体验,更加稳定");listtag.add("2.引入大量优质用户");listtag.add("3.修复已知问题");listtag.add("4.风格修改");for (int i = 0; i < listtag.size(); i++) {textView = new TextView(context);textView.setTextColor(ContextCompat.getColor(context, sakura.bottommenulibrary.R.color.bottom_menu_layout_colors));textView.setTop(5);textView.setText(listtag.get(i));lin_text.addView(textView);}}tv_update.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertDialog.dismiss();AppDownloadUtils.getInstance(AppManager.getAppManager().currentActivity()).setDownUrl(url).start();}});}if (upgrade_type==1){tv_cancel.setVisibility(View.GONE);alertDialog.setCanceledOnTouchOutside(true);alertDialog.setCancelable(true);}else if (upgrade_type==0){tv_cancel.setVisibility(View.VISIBLE);alertDialog.setCanceledOnTouchOutside(true);alertDialog.setCancelable(true);}if (PreferenceUtil.getInstance().isHomeHeaderFirst()) {alertDialog.dismiss();}else {if (AppDownloadUtils.getInstance(context).isLoad()){alertDialog.dismiss();}else {alertDialog.show();}}//alertDialog.show();}public void dismissDialog () {if (alertDialog != null) {alertDialog.dismiss();alertDialog = null;}}
}

Android 单利模式(分类解析)相关推荐

  1. android+单利模式中传递context,Android的Context详解

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android 是基于Java的,很多时候可以用Java的思想来等同思考,但是却不能和Java进程直接一个Main函数就 ...

  2. Android N App分屏模式完全解析

    Android N App分屏模式完全解析(上) 发表于 2016-03-12 |  分类于 技术 | 上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Andro ...

  3. Android N App分屏模式完全解析(上)

    上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...

  4. Android art模式解析

    Android art模式解析 本文主要针对android系统art模式下面从安装apk到运行apk的一个过程,主要有一下几个方面: Art虚拟机介绍 安装时dex文件转化为oat文件 oat文件对应 ...

  5. Android MVP模式 解析JSON 显示到ListView上

    Android MVP模式 解析JSON 显示到ListView上 有关MVP模式的介绍,这里不作详细解释,稍后会更新MVP设计模式,请等待链接-- 简述本次的主要功能实现: 通过mvp设计模式,(M ...

  6. Android开源项目分类汇总-转载

    太长了,还是转载吧... 今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有 ...

  7. Android开源项目分类汇总[转]

    Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析 欢迎加入 QQ 交流群:383537512(入群理由需要填写 ...

  8. 2016年GitHub上史上最全的Android开源项目分类汇总

    以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...

  9. Android 开源项目分类汇总(下)

    Android 开源项目分类汇总(下) 九.ScrollView Discrollview 支持滚动时 Item 淡入淡出,平移,缩放效果的 ScrollView 项目地址:https://githu ...

最新文章

  1. VS2010 定位文件在solution中的位置
  2. Docker安装gogs git仓库
  3. linux里ip地址正常但远程连接不上,linux系统上解决postgres远程连接不上的问题
  4. python怎么查询元素是否在列表中_python怎么判断某一元素是否在列表中
  5. 主板19针接口_装机新人手册:一分钟学会主板跳线
  6. junit测试SSH基本环境
  7. css字体及css文本控制
  8. 2020年微信视频号数据分析生态趋势调查报告
  9. 请问smartadmin中如何只用其treeview 组件?
  10. RXTX for java在arm上的使用
  11. Android仿网易云项目代码,Android项目实战教程之高仿网易云音乐启动页实例代码...
  12. matlab interp1 spline,中国大学MOOC: MATLAB/Octave函数interp1中有一个描述插值方法的参数,其中spline表示...
  13. 旅行社H5广告宣传怎么做?
  14. sql server2000挂起的解决方法
  15. WordPress实现点击标签云中的某一标签,就展示出此标签下的所有文章
  16. 显示隐藏图片html,JavaScript实现显示和隐藏图片
  17. 红帽RHCE考试下午-RHCE (RH294)任务概览[2021最新版]
  18. WIN10 困扰多时的屏幕亮度 终于可以调节了-完美 -更新2018年2月28日
  19. 斐波那契(Fibonacci)数列问题
  20. EnerPulse10电源维修EN直流脉冲电源维修

热门文章

  1. 人类认知能力的核心:推理能力,创造力,语言能力,决策能力和学习能力
  2. 【Redis】冷备份、温备份和热备份
  3. 生成对应的二维码下载app
  4. html渐变设置颜色长度,css渐变色注意的几点
  5. 石家庄外国语学校计算机,热烈祝贺石家庄外国语学校吴雨霏同学被美国麻省理工学院MIT录取!全国唯一的女生!...
  6. php初始化函数赋值,PHP变量的初始化以及赋值方式介绍
  7. Yangtze worknote
  8. 【100%通过率】华为OD机试真题 JS 实现【硬件产品销售方案】【2023 Q1 | 100分】
  9. 用Numpy和Pandas分析二维数据笔记
  10. 数据类型分类,请过目,电脑放大看更清晰哦,嘿嘿