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.

559259945 加群交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,870评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,377评论 0 17
  • �关节弹响是指我们人体的关节在运动时发出的响声。在运动的时后常能听到有人发出“嘎嘎”的声响,比如练深蹲时膝关节有响...
    一颗梧桐树阅读 2,761评论 5 6
  • http://acm.hdu.edu.cn/showproblem.php?pid=1000 题目要求:两个数字求和
    Lancy233阅读 235评论 0 0
  • 心的觉知和调整,是一种能力。若能经由修习,让心变得清晰,看得明事物的本质,从而获得更多的空间承受,名为某种自由。 ...
    木卯丁阅读 183评论 0 1