Android生命周期组件Lifecycle遇上高德地图[亲测有效]

Android生命周期组件Lifecycle遇上高德地图[亲测有效]最近在学习jetpack,正好项目中的地图方面的功能需要优化,所以正好使用Lifecycle优化下代码。 Lifecycle 是具有生命周期感知能力的组件,这样可以解决activity和fragment中的生命周期问题。 因为项目中BaseActivity是继承的AppComp…

前言

最近在学习jetpack,正好项目中的地图方面的功能需要优化,所以正好使用Lifecycle优化下代码。

Lifecycle 的作用

Lifecycle 是具有生命周期感知能力的组件,这样可以解决activity和fragment中的生命周期问题。

Lifecycle 的基本使用

一、导入依赖库

implementation "androidx.lifecycle:lifecycle-runtime:2.1.0"

二、 activity 继承AppCompatActivity或自己实现LifecycleOwner接口

因为项目中BaseActivity是继承的AppCompatActivity,所以这里就不实现LifecycleOwner接口了。

三、创建地图定位监听类AMapLocationListener

  1. 实现LifecycleObserver
public class AMapLocationListener implements LifecycleObserver {
    
}
  1. 使@OnLifecycleEvent注解来表明功能所在的生命周期Lifecycle.Event.ON_CREATE对应onCreate
 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void createLocation(){
        initLocation();
        startLocation();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void destroyLocal(){
        destroyLocation();
    }
  1. 最后在Activity中使用
    //添加定位监听
   AMapLocationListener aMapLocationListener = new AMapLocationListener();
   getLifecycle().addObserver(aMapLocationListener);

下面放上完整代码

AMapLocationListener

public class AMapLocationListener implements LifecycleObserver {
    private AMapLocationClient locationClient;
    //声明mLocationOption对象
    private AMapLocationClientOption locationOption = null;

    private LatLng myLatlng;


    public LatLng getMyLatlng() {
        return myLatlng;
    }

    private void setMyLatlng(LatLng myLatlng) {
        this.myLatlng = myLatlng;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void createLocation(){
        initLocation();
        startLocation();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void destroyLocal(){
        destroyLocation();
    }

    private void initLocation() {
        //初始化client
        locationClient = new AMapLocationClient(FPVDemoApplication.getContext());
        locationOption = getDefaultOption();
        //设置定位参数
        locationClient.setLocationOption(locationOption);
        // 设置定位监听
        locationClient.setLocationListener(locationListener);
    }

    /** * 默认的定位参数 */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(true);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(5 * 1000);//可选,设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
        //mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);//可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)
        return mOption;
    }

    /** * 定位监听 */
    com.amap.api.location.AMapLocationListener locationListener = new com.amap.api.location.AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation location) {
            if (null != location) {

                StringBuffer sb = new StringBuffer();
                //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
                if (location.getErrorCode() == 0) {
                    double lat = location.getLatitude();
                    double lon = location.getLongitude();
                    myLatlng = new LatLng(lat,lon);
                    setMyLatlng(myLatlng);
                } else {
                    //定位失败
                    sb.append("定位失败" + "\n");
                    sb.append("错误码:" + location.getErrorCode() + "\n");
                    sb.append("错误信息:" + location.getErrorInfo() + "\n");
                    sb.append("错误描述:" + location.getLocationDetail() + "\n");
                }
            }
        }
    };

    private void startLocation() {
        // 启动定位
        locationClient.startLocation();
    }

    /** * 销毁定位 * * @author hongming.wang * @since 2.8.0 */
    private void destroyLocation() {
        if (null != locationClient) {
            /** * 如果AMapLocationClient是在当前Activity实例化的, * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy */
            //locationClient.disableBackgroundLocation(true);
            locationClient.stopLocation();
            locationClient.unRegisterLocationListener(locationListener);
            locationClient.onDestroy();
            locationClient = null;
            locationOption = null;
        }
    }

    /** * 回到自己的定位 */
    public void moveTolocation(AMap aMap) {
        if (aMap != null && myLatlng != null) {
            //将地图移动到定位点
            aMap.moveCamera(CameraUpdateFactory.changeLatLng(myLatlng));
        }
    }

}

Activity中使用

    //添加定位监听
    AMapLocationListener aMapLocationListener = new AMapLocationListener();
    getLifecycle().addObserver(aMapLocationListener);
    btnLocation.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    aMapLocationListener.moveTolocation(amap);    
                    }
                });

后续准备继续优化,加上放大缩小或地图模式切换等功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13085.html

(0)

相关推荐

  • Python Dictionary: 一站式键值对存储和操作解决方案

    Python Dictionary: 一站式键值对存储和操作解决方案Python是一种流行的编程语言,通常被用于各种各样的用途。其中,Python的字典类型在编程中是一个非常强大的工具。Python字典提供了一种灵活的存储和操作键值对数据的方式。在本文中,我们将介绍Python字典的一些基本概念和功能,并探讨如何使用Python字典作为一站式键值对存储和操作解决方案。

    2024-03-09
    84
  • vscode工作区怎么用_vscode怎么建立站点

    vscode工作区怎么用_vscode怎么建立站点Remote Dev 结合 Setting Sync ,VSCode 已经成为个人最喜欢的应用程序,希望它也能成为你最喜欢的应用程序。

    2023-08-08
    123
  • 用Python找到函数最大值的方法

    用Python找到函数最大值的方法在数学上,可以使用导数的方法来求取函数的最大值。对于一个连续可导的函数,当其导数为0时,即其函数变化率为0,那么这个点就是函数的极值点(包括最大值点和最小值点)。因此,我们可以使用导数的方式来求取函数的最大值。

    2024-02-26
    108
  • DataGrip 在 Database 表名后面显示 comment 注释[亲测有效]

    DataGrip 在 Database 表名后面显示 comment 注释[亲测有效]打开这个选项,就能很直观的看见注释了,对于我这种英文不好的太有用了。 DataGrip 在 Database 表名后面显示 comment 注释

    2023-02-08
    169
  • 技术胖TypeScript图文视频教程 最污的技术课「建议收藏」

    技术胖TypeScript图文视频教程 最污的技术课「建议收藏」近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终提供一个安全的 TypeScript 运行时。 甚至Dahl…

    2023-08-22
    117
  • 深入理解Python def用法

    深入理解Python def用法Python 是一种非常流行和强大的编程语言,它因其简单易学、功能丰富、可读性好和可扩展性等诸多优点而备受青睐。在 Python 中,使用 def 语句来定义函数,可以方便地重复使用语句块,提高代码的可维护性和重用性。但是 Python 的 def 用法还是有一些细节需要深入理解和掌握。本篇文章将重点系统地介绍 Python def 的各个方面。

    2024-06-11
    56
  • azure mysql_数据库性能排行

    azure mysql_数据库性能排行前置条件 用户有查询数据统计权限 GRANT VIEW DATABASE STATE TO database_user; CPU性能问题 正在发生 查看前X个CPU消耗查询 (汇总) SELECT T

    2023-03-13
    154
  • PostgreSQL 12.2 公开课及视频及PGCE认证(第7期)(CUUG)(2020年)

    PostgreSQL 12.2 公开课及视频及PGCE认证(第7期)(CUUG)(2020年)七、PostgreSQL 12.2 Autovacuum调优 1、什么是 autovacuum? 2、为什么需要 autovacuum? 3、记录autovacuum操作日志 4、什么时候在表上做a…

    2023-02-28
    150

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注