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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货园

Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80...

21610
来自专栏Android干货园

Android 高仿微信群聊头像

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/49...

32220
来自专栏向治洪

achartengine之折线图

问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前...

281100
来自专栏向治洪

可拖拽gridview

在Android开发中,我们常常用到ListView和GridView,而有的时候系统的ListView,GridView并不能满足我们的需求,所以我们需要自己...

31450
来自专栏向治洪

BottomSheet底部动作条使用

底部动作条 底部动作条(Bottom Sheets)是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能。底部动作条呈现了简单、清晰、无需额...

27380
来自专栏三好码农的三亩自留地

实现Activity滑动退出

很多应用在二级详情页面加入了滑动退出activity的效果,很方便,心血来潮,想着自己也来实现这个效果,就当做练手吧。

17920
来自专栏androidBlog

自定义 Behavior - 仿新浪微博发现页的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

15220
来自专栏james大数据架构

进度条ProgressBar

拖动滑块改变图片透明度 1.布局 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/...

22750
来自专栏Android机器圈

Android图片处理--缩放

把ImageView或者PhotoView的对象名直接添加到display中就OK 了。

26860
来自专栏向治洪

android下拉加载更多

新浪微博,和QQ空间里面,都有那个下拉刷新的效果,另很多人眼前一亮,细细分析,原理原来如此。 在原作者的基础上,写了一些注释,和帮助大家更好的阅读理解,(可...

35860

扫码关注云+社区

领取腾讯云代金券