整合大量开源库温习基础项目(二)顺便再提提单例模式

转载请注明出处:王亟亟的大牛之路

这一篇,属于开篇,把我们初期用到的一些资源做展示,之后会陆续添加,当然这是一个Git的public项目,更欢迎你的加入!

每个程序员都想,写点天花乱坠的东西,但是需求决定创造,往往我们不知道去做些什么,之前写了一些登录啊,注册啊,噼里啪啦一堆东西的小项目,然后做到核心部分,这个App要干什么?就茫然了。。。然后?。。然后就闲置了。。。So。。。。这一次从头再来。。。还是做一步想一步,让代码更合理,可读性更强,设计更合理(拒绝反人类),那么 GO GO GO GO !!

首先先贴一下这一系列使用到的库:
(这几个在我之前的文章中都有出现过)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'cn.pedant.sweetalert:library:1.3'
    compile 'cn.trinea.android.common:trinea-android-common:4.2.15'
    compile 'com.apkfuns.logutils:library:1.0.6'
}

sweetalert:https://github.com/pedant/sweet-alert-dialog
理由:看上去可爱,风格喜欢,简单易用,大小合适。

logutils:https://github.com/pengwei1024/LogUtils
理由:满足需求,呈现样式清晰

trinea-android-common:https://github.com/Trinea/android-common
理由:大牛的工具库(虽然我只用他的ImageCache部分),轻量级的缓存,符合需要。

包结构:

运行的效果

SweetDialog的一些效果:
最通常的Dialog

ErrorDialog

自定义Dialog



项目中的这些工具类都是以单例模式的形式出现在项目中(这话我说的是不是有些别扭?),像这样:
(这部分每个方法的new SweetAlertDialog(Context)部分还可以做优化,重用什么的。但是重点不在这里,想说的是,整个应用只有一个DialogUtils 的事例)

public class DialogUtils implements Serializable {

    private static class SingletonHolder {
        /**
         * 单例对象实例
         */
        static final DialogUtils INSTANCE = new DialogUtils();
    }

    public static DialogUtils getInstance() {
        return SingletonHolder.INSTANCE;
    }

    /**
     * private的构造函数用于避免外界直接使用new来实例化对象
     */
    private DialogUtils() {
    }

    /**
     * readResolve方法应对单例对象被序列化时候
     */
    private Object readResolve() {
        return getInstance();
    }

    /*標題對話框
    * @param Context context:上下文對象
    * @param String msg:標題的文字
    * */
    public void showTitleDialog(Context context, String msg) {
        new SweetAlertDialog(context)
                .setTitleText(msg)
                .show();
    }

    /*標題+文字對話框
    * @param Context context:上下文對象
    * @param String title:標題
    * @param String msg: 具體文字內容
    * */
    public void showTitleAndMsgDialog(Context context, String title, String msg) {
        new SweetAlertDialog(context)
                .setTitleText(title)
                .setContentText(msg)
                .show();
    }

    /*錯誤提示對話框
    * @param Context context:上下文對象
    * @param String title:標題
    * @param String msg: 具體文字內容
    * */
    public void showErrorDialog(Context context, String eTitle, String msg) {
        new SweetAlertDialog(context, SweetAlertDialog.ERROR_TYPE)
                .setTitleText(eTitle)
                .setContentText(msg)
                .show();
    }

    /*警告對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confimText:按鈕的文字
    * */
    public void showWarningDialog(Context context, String eTitle, String msg, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(eTitle)
                .setContentText(msg)
                .setConfirmText(confirmText)
                .show();
    }

    /*成功對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * */
    public void showSuccessDialog(Context context, String title, String msg) {
        new SweetAlertDialog(context, SweetAlertDialog.SUCCESS_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .show();
    }

    /*自定義icon對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param int icon:圖片素材
    * */
    public void showCustomIconDialog(Context context, String title, String msg, int icon) {
        new SweetAlertDialog(context, SweetAlertDialog.CUSTOM_IMAGE_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setCustomImage(icon)
                .show();
    }

    /*綁定按鈕事件對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confirmText:按鈕的文字
    * setConfirmClickListener: 監聽事件
    * */
    public void showWarningListenerDialog(final Context context, String title, String msg, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setConfirmText(confirmText)
                .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.dismissWithAnimation();
                    }
                })
                .show();
    }

    /*綁定複雜按鈕事件對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confirmText:按鈕的文字
    * setConfirmClickListener: 確認監聽事件
    * setCancelClickListener: 取消監聽事件
    * */
    public void showWarningAllDialog(final Context context, final String title, String msg, String cancelText, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setCancelText(cancelText)
                .setConfirmText(confirmText)
                .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.dismissWithAnimation();
                    }
                })
                .showCancelButton(true)
                .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.cancel();
                    }
                })
                .show();
    }

}

-概念(之后还会有别的设计模式)

单例模式是设计模式中最简单的一种,但是它没有设计模式中的那种各种对象之间的抽象关系,所以有人不认为它是一种模式,而是一种实现技巧.单例模式就像字面的意思一样,提供一个只能自己实例化的实例,并且提供了一个全局的访问点.要达到这几点要求就要满足三点:私有构造函数(防止被别人实例化),静态私有自身对象(用来提供实例),静态公有的getInstance方法(用来创建和获取实例对象).

优缺点: 单例只允许自己建立一个实例,不需要频繁创建和销毁,可以节省内存加快对象的访问速度.
但是单例没有抽象层和接口,不方便扩展.单例既提供工厂方法又提供业务方法,一定程度上违背了单一职责原则

-单例实现
单例的实现有两个主流方式,分别是懒汉模式和饿汉模式,他们在实例化的时机和效率方面各有不同

懒汉模式:懒汉模式在外部对象每次获取实例时都要先判断该实例是否被初始化,这点相比饿汉模式来说就会损失一些效率,但是会节省一些空间,因为什么时候用到该实例才会去初始化,如果一直用不到的话,在懒汉模式里面时不会构造该对象的.相当于用空间换时间.也就是延迟加载技术.还有一点需要注意的是一定要有私有构造,要不然外部对象还是可以实例化该对象,那还谈何单例.

饿汉模式:饿汉模式是在系统运行起来,在装在类的时候就进行初始化的操作,外部对象使用的时候不需要做任何判断可以直接使用,从效率上来说是优于懒汉模式的.但是对比懒汉模式的延迟加载技术,不管系统用不用该实例,内存都会在最开始的时候创建出来.跟懒汉的时间换空间正好相反,饿汉是空间换时间.

概念的东西,更多的可以看:http://www.iteye.com/topic/575052

然后就是我们的一个自定义Toasat(陷入这个表情无法自拔,哈哈)

public class ToastUtils {
    private static ToastUtils instance;

    private ToastUtils(){}

    public static ToastUtils getInstance(){
        if (instance == null) {
            instance = new ToastUtils();
        }
        return instance;
    }

    public  void show(Context context, String text, boolean isLong) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View layout = inflater.inflate(R.layout.toast_layout, null);

        ImageView image = (ImageView) layout.findViewById(R.id.toast_image);
        image.setImageResource(R.drawable.icon);

        TextView textV = (TextView) layout.findViewById(R.id.toast_text);
        textV.setText(text);

        Toast toast = new Toast(context);
        toast.setGravity(Gravity.CENTER, 0, 550);
        toast.setDuration((isLong) ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
        toast.setView(layout);
        toast.show();
    }
}

Toast效果:

其他工具类的运行效果:

源码地址:https://github.com/ddwhan0123/SoyiGit/tree/master/Soyi

点个Star,谢谢。你的支持是我的动力!

时间: 2024-08-22 14:26:51

整合大量开源库温习基础项目(二)顺便再提提单例模式的相关文章

整合大量开源库温习基础项目(三)登陆注册主页面大致完成,分析下怎么处理用户信息

转载请注明出处:王亟亟的大牛之路 说内容之前运行效果图,毕竟这样是最直观的(不知道为什么白色截图下来就成黄的了) 样例Apk地址:https://github.com/ddwhan0123/SoyiGit/blob/master/Soyi/Soyi.apk 上一篇文章写到了项目中引用到的一些第三方框架,这一篇我们来具体敲我们的业务和实现. -那一个App常规的有什么? 引导页面,注册,登录,主页面,具体内部业务,设置等等等.我们一步一步做.,这一篇主要说的是登陆注册以及主页面的架构部分的代码和内

整合大量开源库温习基础项目(四)伸缩实现OverscrollScale以及MaterialLoadingProgressBar

转载请注明出处:王亟亟的大牛之路 运行效果:(还是有点卡顿,大致看得到内容) 这一次的菜单的UI在上一篇文章中已经做了修改,上一篇的样子: 因为没想到要做些什么东西,所以大致的放了这几个栏目,这一片先把我们新加入的库来讲一下. Gradle: compile 'com.dodola:listviewext:1.0' compile('com.lsjwzh:materialloadingprogressbar:0.5.8-RELEASE') 支持伸缩的ListView : https://gith

整合大量开源库项目(八)可以加载Gif动画的GifImageView

转载请注明出处王亟亟的大牛之路 上周大多数时间都是根据兴起,想到什么做什么写了几个自定义控件,把Soyi丢在那没怎么动,今天就把写的东西整合进来,顺便把SOyi"个人研发的结构理一下". 先上一下今天整合之后的效果,以及新加进来的几个库: 按照惯例,贴一下Gradle的配置: dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'c

整合大量开源库项目(五)跳动的TextView JumpingBeans,良好体验的滚动栏ConvenientBanner

转载请注明出处:王亟亟的大牛之路 时间过得很快,这一系列已经写了第五篇了(感觉还要写好久),今天又引入了2个很好用的库JumpingBeans,ConvenientBanner.首先,先看一下效果. 1.这2个控件做了什么? JumpingBeans是加载页面时那个蓝色跳动的动画效果. JumpingBeans:https://github.com/frakbot/JumpingBeans ConvenientBanner是滚动的那个广告栏. ConvenientBanner:https://g

整合大量开源库项目(六)ListView动画,Activity"抽象化",顺便提一提”抽象类“And"接口"

转载请注明出处:王亟亟的大牛之路 昨天发了一个自己写的简单的诸如EditText一个自定义控件,不过貌似反响不太好,这里再推一推,希望大家给予意见和支持:http://blog.csdn.net/ddwhan0123/article/details/50235151 OK,言归正传,上一次添加了一个"个人开发:界面,希望把之后自己写的一些东西都加入里面,作为一个"大型Lib"使用,所以就简单的把内容和界面搭了一下,也大致区分了下栏目,这种展示性的还是以ListView为佳,上

android 使用开源库zxing生成二维码,扫描二维码【转】

转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口.可以实现使用手机的内置的摄像头完成条形码和二维码的扫描与解码.可以实现条形码和二维码的编码与解码. github官网源码地址:https://github.com/zxing/zxing 开源库api文档:https://zxing.github.io/zxing/a

源代码-我在学习Android 的ZXing开源项目二维码时 有几个类 不清楚他具体的意义,功能。

问题描述 我在学习Android 的ZXing开源项目二维码时 有几个类 不清楚他具体的意义,功能. ①BitMatrix.java ②ByteMatrix.java ③MultiFormatWriter.java ④QRCodeWriter.java 这4个 我实在不懂 这功能,这里面哪个 是将输入字符串 变成那个0,1 那个的?用什么算法了...我这是Android工程. 谢谢了...

请问有哪些网站是使用java开源sns项目二次开发做的?

问题描述 请问有哪些网站是使用java开源sns项目二次开发做的? 请问有哪些网站是使用java开源sns项目二次开发做的?想基于java开源sns项目做二次开发 解决方案 网上很多都是基于Java的

Android Studio项目中导入开源库的方法_Android

前两天,谷歌发布了Android Studio 1.0的正式版,也有更多的人开始迁移到Android Studio进行开发.然而,网上很多的开源库,控件等还是以前的基于Eclipse进行开发,很多人不知道怎么导入到自己的基于Android Studio项目中来,微博上也有人私信我,让我来写写,正好今天回来的比较早,就写写吧.主要介绍一下常见的一些导包的场景. 前言 复制代码 代码如下: --project   //项目目录   |   build.gradle  //项目的gradle配置文件