Android网络请求慢的时候,任意位置弹出加载中提示
大家好我是王大锤,我们老板给我一个任务,让我在任何有网络请求的地方,如果时间超过一秒就提示一个加载中的提示,好去捞客户的钱 。但是我对着已经做得差不多定型的APP怀疑了整整一个下午人生,这尼玛坑爹啊,这都写完了,这么多地方呢,我得改到什么时候。
不过还好我机智,我想:既然需要1秒钟以后才弹出来,思来想去我决定用popuWindow,因为这玩意儿不阻挡当前界面操作,这是我最喜欢的地方。然后这个popuwindow肯定需要传入一个View控件,因为我不知道我需要在哪里提示出来,那么代码被我撸出来了:
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.view.View
import android.view.ViewGroup
import android.widget.PopupWindow
import com.yongxing.QianJR.R
/**
* Created by xiaolei on 2017/10/23.
*/
class LoadingPopuWindow(view: View) : PopupWindow()
{
private val contentV by lazy {
View.inflate(view.context, R.layout.layout_loading, null)
}
private val parView = view
init
{
this.contentView = contentV
this.width = ViewGroup.LayoutParams.WRAP_CONTENT
this.height = ViewGroup.LayoutParams.WRAP_CONTENT
this.isFocusable = false
// 设置外部可以点击
this.isOutsideTouchable = true
// 设置背景透明
this.setBackgroundDrawable(BitmapDrawable(view.context.resources, null as Bitmap?))
}
}
然后我发现还是太年轻了,虽然不阻挡当前界面的操作,但是我发现这玩意儿点击 popuwindow外面,这个popuwindow就自动关掉了,这我不可以忍,WTF??你自动关掉算怎么回事啊,那还怎么做提示啊。
原来需要在popuwindow里加上这么一句代码:
// 设置点击popuwindow外边不关闭popuwindow
this.setTouchInterceptor { _, _ ->
true
}
那么我们现在的代码是这样的:
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.view.View
import android.view.ViewGroup
import android.widget.PopupWindow
import com.yongxing.QianJR.R
/**
* Created by xiaolei on 2017/10/23.
*/
class LoadingPopuWindow(view: View) : PopupWindow()
{
private val contentV by lazy {
View.inflate(view.context, R.layout.layout_loading, null)
}
private val parView = view
init
{
this.contentView = contentV
this.width = ViewGroup.LayoutParams.WRAP_CONTENT
this.height = ViewGroup.LayoutParams.WRAP_CONTENT
this.isFocusable = false
// 设置外部可以点击
this.isOutsideTouchable = true
// 设置背景透明
this.setBackgroundDrawable(BitmapDrawable(view.context.resources, null as Bitmap?))
// 设置点击popuwindow外边不关闭popuwindow
this.setTouchInterceptor { _, _ ->
true
}
}
}
OK初步已经完成了,开始沾沾自喜了,欣喜的笑容很快就印在嘴角上了,然后我又遇到了一个问题, 我想在控件的下方正中央显示,可是我获取到的popuwindow的宽度总是0是怎么回事?? 原来在popuwindow里需要进行一次测量,才可以正确获取popuwindow的宽高,
this.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
好了,那么我们现在就搞定了完整的代码如下:
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.view.View
import android.view.ViewGroup
import android.widget.PopupWindow
import com.yongxing.QianJR.R
/**
* Created by xiaolei on 2017/10/23.
*/
class LoadingPopuWindow(view: View) : PopupWindow()
{
private val contentV by lazy {
View.inflate(view.context, R.layout.layout_loading, null)
}
private val parView = view
init
{
this.contentView = contentV
this.width = ViewGroup.LayoutParams.WRAP_CONTENT
this.height = ViewGroup.LayoutParams.WRAP_CONTENT
this.isFocusable = false
// 设置外部可以点击
this.isOutsideTouchable = true
// 测量当前popuwindow的宽高,必须测量,下一步还得用呢
this.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
// 设置背景透明
this.setBackgroundDrawable(BitmapDrawable(view.context.resources, null as Bitmap?))
// 设置点击popuwindow外边不关闭popuwindow
this.setTouchInterceptor { _, _ ->
true
}
}
fun show()
{
// 显示的位置为,控件的下方水平中间的位置
showAsDropDown(parView,parView.width/2-contentView.measuredWidth/2,0)
}
}
既然popuwindow已经被撸的差不多了,我在想我需要用什么图片作为加载中的提示信息呢?那肯定不能用静态图片,不存在的,不弄点动态图怎么去骗客户的钱。
然后我选择了这个开源库:https://github.com/81813780/AVLoadingIndicatorView
我们来看看人家的实例:
输入图片说明
哇靠!完美,然后我结合自己的网络请求封装,又开了一个 接口 →_→
import android.view.View;
import com.xiaolei.easyfreamwork.network.common.SCallBack;
import com.yongxing.QianJR.PopupWindows.LoadingPopuWindow;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
/**
* 用于需要添加网络请求,提示加载中提示的地方
* Created by xiaolei on 2017/10/23.
*/
public abstract class LoadingCallBack<T> extends SCallBack<T>
{
private LoadingPopuWindow loadingPopuWindow;
private boolean hasFinish = false;
public LoadingCallBack(View view)
{
super(view.getContext());
loadingPopuWindow = new LoadingPopuWindow(view);
Observable.timer(1, TimeUnit.SECONDS)//一秒钟以后再执行,一秒钟还没加载出来,说明网络卡,肯定需要弹出
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>()
{
@Override
public void call(Long aLong)
{
if(!hasFinish)
{
loadingPopuWindow.show();
}
}
});
}
@Override
public void onFinally()
{
hasFinish = true;
Observable.just(loadingPopuWindow)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<LoadingPopuWindow>()
{
@Override
public void call(LoadingPopuWindow loadingPopuWindow)
{
loadingPopuWindow.dismiss();
}
});
}
@Override
public void onField(Throwable t)
{
}
@Override
public abstract void onSuccess(T result) throws Exception;
}
OK 喷了那么多,我知道你们只想看效果图和偷老子代码。来吧,上图:
输入图片说明
这里使用了RXJAVA用来避免在子线程中修改UI,以及延时一秒以做到判断是否网络卡的情况
当然,既然是popuwindow,你就可以随意更改提示的图样,或者文字。配合你自己的网络请求框架或者封装,就可以做到一个提示。
END.
- 如何使用SAML配置CDSW的身份验证
- ASP.NET MVC编程——控制器
- ASP.NET MVC编程——视图
- 设计原则
- Entity Framework——配置文件设置
- 如何安装SAS并配置连接Hive/Impala
- Entity Framework——记录执行的命令信息
- 【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅
- CVE-2015-1641 Word 利用样本分析
- Cloudera Navigator介绍与安装
- [LeetCode]String主题系列{第5,6题}
- CDH内存调拨过度警告分析
- Ztorg:从 root 到 SMS
- [LeetCode]Math主题系列{第7,9,13,273题}
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 使用 centOS 7 部署前端项目
- PHP rand() 函数随机整数。
- PHP使用htmlspecialchars方法实现像ASP的Server.HTMLEncode一样的效果
- jquery.ajax()怎么把获取来的内容转为JSON,并使用。
- Spring:IOC 控制反转
- Spring:AOP 面向切面编程
- JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
- JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
- Spring:JDBC Template,声明式事务
- Spring:讲解编程题
- SpringMVC:基本应用
- SpringMVC:进阶
- SpringMVC:SSM 整合
- 12 | Tornado源码分析:BaseIOStream 对象(上)
- 数据一致性校验及数据同步,运维必看