Android单一实例全局可调用网络加载弹窗

  

最近因为项目需求,需要完成一个全局的网络加载弹窗需求,真正完成这个需求之后,感觉最重要的不是结果,而是思维。

  

我刚开始接到这个需求的时候,第一种想到的方案是基类加单例。但是实际做起来之后发现,因为单例的原因,你的弹窗只能在第一次创建这个单例的活动中显示出来。

  

那么发现这个问题之后在这个的基础上改进一下,如果我不活动用的上下文,而是采用类似于应用程序的一种全局上下文呢?当然,个人能力有限,这种想法就给毙掉了,后来由导师指点,利用服务的上下文,对话框的风格设置为系统级弹窗,那么这时候就会有一种潜在的情况,如果应用退到后台的话,加载网络的时候不管用户在那个页面,都会显示这个弹窗,严重影响用户体验。

  

后来把思路又回到起点,需要实现两个点,一:全局可调用。二:单一实例。

  

总结一下遇到的问题:

  

一、对话框必须依赖活动

  

二,因为单例的原因,对话框只能在第一次创建单例的活动显示

  

三,不能使用系统级弹窗

  

好的,基于这些问题和要求,结合自己所掌握的知识。

  

对话框必须依赖活动,那我就创建一个活动,专门去承载这个对话框中,活动背景设置为透明,效果达到。

  

这时又会出现新的问题,如果在单例中去开启这个活动,那么就会有很多对话框对象,违反初衷,如果在单例中创建对话框,那么开启活动的时候又会有很多意图对象,得不偿失。解决方法,创建两个单例,保证意图对象和对话框对象都保持唯一。

  

实际测试发现,第一次可以正常显示,第二次就会崩溃。

  

<强>原因:当活动被销毁,又重新创建的时候,上下文会改变。因为单例的原因,你对话框的上下文还是第一次活动被创建时候的上下文,那么你再次调用这个对话框的时候,就会报活动不存在的异常。

  

到这里似乎没有办法解决了。

  

再次思考这个问题,突然灵光一闪,为什么我非要用对话框呢?我既然已经创建出一个专门承载这个对话框的活动了,而且活动的死活是完全和对话框一致的,那么我为什么还要再去创建一个对话框呢?直接把对话框的布局写在活动里不行吗?当外部去创建这个活动的时候直接播放动画,同时提供一个暴露给外部的关闭方法。而且这样也能用单例保证这个活动实例的单一性。

  

想到就去做,经过尝试和优化,问题完美解决。

  

下面是具体实现代码:

  

要显示的活动:

        公开课NetWaitDialogActivity延伸AppCompatActivity {      @Override   保护空白>   & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt; RelativeLayout xmlns: android=" http://schemas.android.com/apk/res/android "   android: layout_width=" match_parent "   android: layout_height=" match_parent "   xmlns:壁画=" http://schemas.android.com/apk/res-auto "比;         & lt; com.facebook.drawee.view.SimpleDraweeView   android: id=癅 + id/netwait_dialog_gif”   android: layout_width=" 360 dp”   android: layout_height=" 100 dp”   android: layout_centerInParent=" true "   壁画:roundedCornerRadius=" 20 dp祝辞& lt;/com.facebook.drawee.view.SimpleDraweeView>         & lt;/RelativeLayout>      

style.xml中创建透明样式:

        & lt; !——网络加载活动背景——比;   & lt;样式名="透明"父=癟heme.AppCompat.Light.NoActionBar”比;   & lt;项目名称=" android: windowBackground "祝辞@android:颜色/transparent   & lt;项目名称=" android: windowIsTranslucent "祝辞true   & lt;项目名称=" android: windowAnimationStyle "祝辞@android:风格/Animation   & lt;项目名称=" android: windowNoTitle "祝辞true   & lt;/style>      

AndroidManifest.xml中设置样式:

        & lt;活动android: name=" .NetWaitDialogActivity "   android:主题=" @style/透明”祝辞& lt;/activity>      

单例工具类:

        公开课NetWaitStatusUtils {   私有静态NetWaitStatusUtils实例;   私人目的意图;   私人上下文语境;      私人NetWaitStatusUtils(上下文语境){   这一点。上下文=上下文;   意图=new意图(上下文,NetWaitDialogActivity.class);   }      公共静态NetWaitStatusUtils getInstance(上下文语境){   如果(实例==null) {   实例=new NetWaitStatusUtils(上下文);   }   返回实例;   }      公共空间展示(){   context.startActivity(意图);   }      公共空间把(){   NetWaitDialogActivity.dismiss ();   }   }

Android单一实例全局可调用网络加载弹窗