前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android网络请求慢的时候,任意位置弹出加载中提示

Android网络请求慢的时候,任意位置弹出加载中提示

作者头像
Xiaolei123
发布2019-03-20 11:53:21
1.6K0
发布2019-03-20 11:53:21
举报
文章被收录于专栏:肖蕾的博客肖蕾的博客

大家好我是王大锤,我们老板给我一个任务,让我在任何有网络请求的地方,如果时间超过一秒就提示一个加载中的提示,好去捞客户的钱 。但是我对着已经做得差不多定型的APP怀疑了整整一个下午人生,这尼玛坑爹啊,这都写完了,这么多地方呢,我得改到什么时候。 不过还好我机智,我想:既然需要1秒钟以后才弹出来,思来想去我决定用popuWindow,因为这玩意儿不阻挡当前界面操作,这是我最喜欢的地方。然后这个popuwindow肯定需要传入一个View控件,因为我不知道我需要在哪里提示出来,那么代码被我撸出来了:

代码语言:javascript
复制
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里加上这么一句代码:

代码语言:javascript
复制
// 设置点击popuwindow外边不关闭popuwindow        
  this.setTouchInterceptor { _, _ ->             
    true        
  }

那么我们现在的代码是这样的:

代码语言:javascript
复制
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的宽高,

代码语言:javascript
复制
this.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)

好了,那么我们现在就搞定了完整的代码如下:

代码语言:javascript
复制
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 我们来看看人家的实例:

输入图片说明
输入图片说明

哇靠!完美,然后我结合自己的网络请求封装,又开了一个 接口 →_→

代码语言:javascript
复制
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.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-3-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档