Android首页获取定位权限后,如何避免第一次加载时数据为空

前言

项目中涉及到定位问题 在第一次下载app
进入首页时获取用户当前定位 并根据用户定位加载附近的油站信息

问题

在第一次进入app首页时 获取定位失败 加载不到数据 页面显示为空

问题分析

造成这个原因是进入首页再获取定位 已经晚了 因为首页要请求网络数据
①获取当前定位
②根据定位加载相关数据
这两个条件是因果关系 当我们进入页面不做任何处理的时候 这个时候即使获取定位成功
也获取不到网络数据

问题解决

方法一

在引导页就弹出定位权限 让用户点击授权 然后把定位的信息保存起来
到首页时 根据引导页定位拿到的经纬度 获取后台数据 然后显示
这样分开来处理 有不会出现数据为空的情况
但是
我用这个方法 好像偶有bug 因为项目比较赶 也没有深入研究 感觉问题不大 应该好解决

方法二

这个方法是博主用的方法 比较推荐 理解起来也比较简单
下面说一下自己的思路
首页在引导页弹框让用户授权定位权限,用户授权更好 不授权也没有关系
进入首页的时候也检测权限 用到的权限是否已授权 如果没有继续弹框 如果已经授权
拿到定位后 将定位的经纬度保存起来 用来请求网络数据的参数
利用Loading加载动画 给网络请求数据争取时间 其实就是个障眼法 哈哈
Loading完之后 再请求一次数据

方法三

这个方法是博主想到的解决方法 没有尝试 但是应该也可以解决问题
出发点是 进入引导页后 直接跳转登录页面 在登录之前就把定位信息保存起来
如果取到的定位信息为null 不给用户登录

方法二 案例

	//使用权限检测框架 EasyPermissions
 	@AfterPermissionGranted(RC_LOCATION)
    private void requiresLocationPermissionMethod() {
    	//权限列表
        String[] perms = {Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS};
        if (EasyPermissions.hasPermissions(Objects.requireNonNull(getActivity()), perms)) {
            mLocationHelper.startLocation();//开始获取位置
            startLocation();//开始高精度获取位置
            showProgressDialog("提示","加载中,请稍等...");//弹出Loading框
        } else {
            EasyPermissions.requestPermissions(this, getString(R.string.location_rationale),
                    RC_LOCATION, perms);
        }
    }

Loading弹框

这里弹框只是为了给程序拿到定位的经纬度腾出时间

private void showProgressDialog(String title, String content) {
        if (progressDialog == null) {
            progressDialog = ProgressDialog.show(getActivity(), title,
                    content, true, false);
        } else if (progressDialog.isShowing()) {
            progressDialog.setTitle(title);
            progressDialog.setMessage(content);
        }
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
               hideProgressDialog();
            }
        }, 2000);
        progressDialog.show();
    }

关闭Loading弹框

在关闭Loading弹框时 请求一次网络数据 这样就解决了
首次进入主页时 数据为Null的尴尬局面

private void hideProgressDialog() {
        if (progressDialog != null && progressDialog.isShowing()) {
        	//这里请求一次网络 并把刚刚在弹框时 取到的定位信息 作为参数上传上去
            mPresenter.getGasStationDetailsSort(currentGaragePosition);
            progressDialog.dismiss();
        }
    }

效果图

说了这么多 没有一张图也看不出来效果 下面我就贴出gif效果图
如果有相同情况的可以参考一下

图一

引导页弹出定位授权 用户点了同意授权的情况
用户点了同意 利用弹框时间 拿到定位数据 然后把数据请求回来 并显示出来
1

图二

引导页弹出定位授权 用户没有点同意授权的情况
在用户点完以后更新数据并显示出来
2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕氏春秋i

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值