安卓日常问题杂谈(一)

在这里插入图片描述

背景

关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓开发过程中遇到的小问题,能快速解决问题。

开发环境

androidstudio
win10+
gradle4+

本文涉及知识

WebView
微信开放平台
MPAndroidChart
Dialog
PhotoView
gsyVideoPlayer

主体内容

WebView

(1)安卓在使用webview的页面中,进入页面后,webview在初始化中无故滑动。

原因是webview焦点引起的问题。解决方法:在webview的父布局,加上一下属性:

android:descendantFocusability="blocksDescendants"

微信开放平台

(1)微信打开的网页中,点击跳转到安卓APP失效问题,解决方法:

先配置好安卓的微信sdk链接
PS:注意安卓11和安卓13的适配,这里的链接中有。
值得一提的是,如果项目是直接继承三方的wx页面,如友盟的WXCallbackActivity。这个时候我们开发代码的过程,就区别于官方文档了。如果单单是处理微信中的网页跳转到APP指定页面,核心代码如下图:

    @Override
    public void onReq(BaseReq req) {
        LogUtil.d("onReq: " + req.getType());
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:

                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                goToShowMsg((ShowMessageFromWX.Req) req);
                break;
            default:
                break;
        }
        super.onReq(req);

    }

从上面的代码中,可以看到,是直接重写onReq方法即可。这里我们在里面处理ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX这个指令就好了。至于sdk中 的extInfo怎样定义,得配合开发过程进行,不能一概而论。

MPAndroidChart(安卓图表库)

(1)折线图,初始化时,移动到指定的x,退出页面,内存泄漏

需要下载源码后,进行修改,修改方法如下:
(1-1)找到MoveViewJob类中的recycleInstance方法,增加下面的代码:

    public static void recycleInstance(MoveViewJob instance){
        instance.mViewPortHandler = null;
        instance.mTrans = null;
        instance.view = null;
        pool.recycle(instance);
    }

(1-2)在调用跳转的过程中,使用方法moveViewToX进行调用即可

(2)取消当前选中的标签

直接调用API

 chart.highlightValue(null)

Dialog

(1)通过定义基类的Dialog,进行封装生命周期,便于内存回收释放

很多业务中,都会用到dialog,有些甚至时在dialog里面做很多复杂的操作。
因此,业务中得到dialog的生命周期时非常重要,核心代码如下:

public abstract class BaseCustomDialog extends Dialog {


    public BaseCustomDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setOnShowListener(new OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                lifecycleStart();
            }
        });

        setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                lifecycleStop();
            }
        });
    }


    protected void initStyle() {
        try {
            Window window = getWindow();
            if (window != null) {
                window.getAttributes().windowAnimations = R.style.bottomShowAnimStyle;
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.dimAmount = 0.1f; // 设置背景透明度(0.0完全透明,1.0完全不透明)
                window.setAttributes(lp);

                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                window.setStatusBarColor(Color.TRANSPARENT); // 设置状态栏颜色
                window.setNavigationBarColor(Color.TRANSPARENT); // 设置状态栏颜色
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void initFullLayout(){
        getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT;
        getWindow().getAttributes().height = ViewGroup.LayoutParams.MATCH_PARENT;
    }

    protected void lifecycleStart() {
    }

    protected void lifecycleStop() {
    }

}

上述代码,就是基类dialog的封装,对于子类调用,在方法lifecycleStart(),lifecycleStop()中进行内存的释放管理就可以了。

PhotoView(安卓图片预览控件)

(1)关于PhotoView初始化放大图片逻辑

这里要区分情况,看看你是放大width还是height。这里核心的要点,就是计算出放大的倍数,然后通过setScale方法,进行设计即可。核心代码如下:

 				ivFhrContent.setScaleLevels(scaleRate / 0.5 > 1 ? 1f : scaleRate / 0.5f, scaleRate, scaleRate * 2);
                ivFhrContent.setImageDrawable(resourceImage);
                LogUtil.d("scale: " + scaleRate);
                new Handler().postDelayed(() -> {
                    ivFhrContent.setScale(scaleRate,
                            0f,
                            ivFhrContent.getHeight() / 2f,
                            false);
                }, 0);

上述代码中,scaleRate就是放大的系数。

gsyVideoPlayer(安卓播放库)

(1)Https证书问题

核心代码如下:

        ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
            @Override
            public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
                //如果返回 null,就使用默认的
                return null;
            }

            /**
             * 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书
             * demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书
             * */
            @Override
            public HttpDataSource.BaseFactory getHttpDataSourceFactory(String userAgent,
                                                                       @Nullable TransferListener listener,
                                                                       int connectTimeoutMillis, int readTimeoutMillis,
                                                                       boolean allowCrossProtocolRedirects) {
                //如果返回 null,就使用默认的
                return new GSYExoHttpDataSourceFactory(userAgent, listener,
                        connectTimeoutMillis,
                        readTimeoutMillis, true);
            }
        });

上述设置,可以接受重定向以及播放HTTPS数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958498.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3 OS模块中的文件/目录方法说明九

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法:os.pipe() 方法、os.popen() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.pipe() 方法 os.pipe() 方法用于创建一个管道, 返回…

2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源:buuctf [强网杯 2019]Upload 1 目录 一、打开靶机,查看信息 二、解题思路 step 1:登陆进去看情况 step 2:大佬来支援——问题在cookie step 3:测试两个思路 1.目录穿越 2.目录扫描 step 4&#xff…

Go学习:iota枚举

iota注意事项: iota:常量自动生成器,每隔一行,自动累加iota给常量赋值使用iota 遇到 const,重置为 0可以只写一个iotaiota如果是同一行,值都一样 简单代码: package mainimport "fmt&qu…

2025 OWASP十大智能合约漏洞

随着去中心化金融(DeFi)和区块链技术的不断发展,智能合约安全的重要性愈发凸显。在此背景下,开放网络应用安全项目(OWASP)发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

双指针+前缀和习题(一步步讲解)

前言:如果解决下面这几道题有些问题,或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章,有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B,以及一个…

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况,可能是访问的大门没有打开哦,下面我们来看看具体是怎么回事? 当软件远程访问时,主机需要两个条件,一是有一个唯一的公网IP地址(运营商提供),二是开…

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后,我们要做资源管理,还需要做: a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略; b: 根据项目的需求,资源…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

leetcode刷题记录(八十六)——84. 柱状图中最大的矩形

&#xff08;一&#xff09;问题描述 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09;84. 柱状图中最大的矩形 - 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例

SpringBoot 实现动态管理定时任务 Job的动态操作&#xff08;添加、修改、启停、执行、删除&#xff09;以及界面展示和具体Job的创建与执行示例 关键接口类&#xff1a; CronTaskRegistrar SchedulingRunnable . 添加定时任务注册类&#xff0c;用来增加、删除定时任务 impo…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

flutter_学习记录_00_环境搭建

1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的&#xff0c;iOS开发&#xff0c;所以iOS开发环境本身是可用的&#xff1b;外加Mac电脑本身就会配置Java的环境。所以&#xff0c;后面剩下的就是&#x…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份&#xff0c;我已写下一篇《近一年多个人总结》&#xff0c;当时还没开始写博客。四月份写博后&#xff0c;就顺手将那篇总…

综合与时序分析的设计约束(1)——静态时序分析简介

目录 1.绪论2.静态时序分析与动态时序分析3.时序约束在静态时序分析中的作用3.1.约束作为声明3.2. 约束作为断言3.3.约束作为指令3.4.约束作为异常3.5.约束的角色变化 4.STA需要正确约束5.时序路径起点和终点6.建立与保持6.1 建立时间6.2 保持时间6.3 裕度 7.SDC主要类型7.1 时…

【算法日记】从零开始认识动态规划(一)

挫折会来也会过去&#xff0c; 热泪会流下也会收起&#xff0c; 没有什么可以让我气馁的&#xff0c; 因为&#xff0c;我有着长长的一生。 --- 席慕蓉 《写给幸福》--- 从零开始认识动态规划 1 动态规划问题1.1 什么是动态规划算法1.2 动态规划算法如何Debug1.3 动态规划…

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…