<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Crystal_xing的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Crystal_xing</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Crystal_xing]]></copyright><item><title><![CDATA[charles - Map Local功能（请求重定向到本地文件）]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/128202678</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/128202678</guid><author>Crystal_xing</author><pubDate>Tue, 06 Dec 2022 14:45:58 +0800</pubDate><description><![CDATA[大概的说，此功能就是在发送api的时候，返回固定的自己可随便定制的response，为了返回api的固定数据，方便开发或者解bug。先save response到本地，会生出1个文件，里面可以随意的保存response的内容，然后让Charles收到request后，执行本地既定的response，很方便的api测试手段。     以修改这个fuel_history的API为例，初始发过来的数据都是0: 1. 先执行【save response】，这步操作之后会在本地生成1个文件，调试或者测试代码的时候，将]]></description><category></category></item><item><title><![CDATA[Unable to load class ‘javax.xml.bind.JAXBException‘.]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/127390208</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/127390208</guid><author>Crystal_xing</author><pubDate>Tue, 18 Oct 2022 15:48:07 +0800</pubDate><description><![CDATA[【代码】Unable to load class 'javax.xml.bind.JAXBException'.]]></description><category></category></item><item><title><![CDATA[Service fetch error: PERMISSION_DENIED: Firebase In-App Messaging API has not been used]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/126950166</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/126950166</guid><author>Crystal_xing</author><pubDate>Tue, 20 Sep 2022 11:38:40 +0800</pubDate><description><![CDATA[点击蓝色url，启用即可。]]></description><category></category></item><item><title><![CDATA[Android: Rxjava2多线程导致的OOM]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/125765757</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/125765757</guid><author>Crystal_xing</author><pubDate>Wed, 13 Jul 2022 15:57:35 +0800</pubDate><description><![CDATA[当下游观察者使用Schedulers.io()，并且中执行的异步任务过多（比如往100份文件中写入），因为IO scheduler是一个无上限线程池，如果短时间并发量过大，上述情况就是开了100个线程里去执行操作，在手机端大概率可能出现OOM。        解决方案是另设固定大小线程池 ，参考：RxJava自带线程池监控和管理的探索之旅 - 掘金  ，线程池的线程总数设一个比较少的上限（比如2），避免开辟大量的线程。如果待执行任务超出总数就需要在队列中等待了。1. 声明线程池：


2. 下游观察者使用线]]></description><category></category></item><item><title><![CDATA[Android： viewHolder 复用错乱导致的显示错误]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/125743801</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/125743801</guid><author>Crystal_xing</author><pubDate>Tue, 12 Jul 2022 15:25:17 +0800</pubDate><description><![CDATA[情况是： recyclerview item里有个自定义View组件GraphView，负责显示速度曲线，假设有10条item，在切换一下底部bottombar再切换回来，发现第一条item的曲线变了，变成了第3个数据源的速度曲线。同样的操作再切一遍，发现曲线又变了，在适配正确的第一条数据源的情况下，却显示成了其他数据的速度曲线。    根本原因是： recyclerView item的布局经过动态 inflate 加载，因为复用的ViewHolder的View组件保留了之前的状态,并且重新调用OnBind]]></description><category></category></item><item><title><![CDATA[Android： PopWindow背景显示系统提供的阴影]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/125716687</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/125716687</guid><author>Crystal_xing</author><pubDate>Mon, 11 Jul 2022 10:36:18 +0800</pubDate><description><![CDATA[setElevation无效的可能原因是代码中未设置背景，在代码中设一下即可（颜色和布局背景色相同）]]></description><category></category></item><item><title><![CDATA[Android - PurchaseUpdateListener多次触发的应对策略]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/125661217</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/125661217</guid><author>Crystal_xing</author><pubDate>Thu, 07 Jul 2022 16:14:08 +0800</pubDate><description><![CDATA[在billing4.0库版本上发生PurchaseUpdateListener的回调执行多次的bug，用户只点击了billing内购画面上面的购买按钮一次，但是购买成功的回调进入了多次，网上搜了一下没有特别好用的规避方法和解决方案，故自己写了一个。       核心想法是在极短的时间内过滤掉其他多余的次数，只执行一次进入回调后接下来的触发逻辑（下面的adaptCoupon（）就是购买成功后要调用的函数，除了首次意外事件，1.5s内只执行一次），因为如果付费成功，billing回调里的订单一定是唯一的，就像控]]></description><category></category></item><item><title><![CDATA[java - 等待子线程执行结束再继续执行]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/125660849</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/125660849</guid><author>Crystal_xing</author><pubDate>Thu, 07 Jul 2022 15:50:03 +0800</pubDate><description><![CDATA[用CountDownLatch， 在主线程里用 latch.await() 挂起主线程，等待子线程执行完毕再继续执行]]></description><category></category></item><item><title><![CDATA[Client SSL handshake failed: An unknown issue occurred processing the certificate (certificate_unkno]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/123066000</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/123066000</guid><author>Crystal_xing</author><pubDate>Thu, 09 Jun 2022 16:46:17 +0800</pubDate><description><![CDATA[手动cd 到项目的gradlew根路径，然后再敲这个命令即可：




]]></description><category></category></item><item><title><![CDATA[Android：Room动态拼写原生sql语句]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/124242547</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/124242547</guid><author>Crystal_xing</author><pubDate>Mon, 18 Apr 2022 09:59:41 +0800</pubDate><description><![CDATA[如果不用Room提供的注解方式去查询sql，根据需求要写冗长复杂的查询语句（比如查询的条件数量不是固定的，语句不定长），注解的方式去写实现不了需求，那么就要用Room动态拼写原生sql语句去查询：

使用SimpleSQLiteQuery，将原生的sql字符串传进去就行：


  /**
     * home_条件検索
     * @return 検索結果
     */
    public Single&lt;List&lt;RidingLogRoomEntity&gt;&gt; searchCon]]></description><category></category></item><item><title><![CDATA[RxFFmpeg: Android Error while decoding stream #0:0: Invalid data found when processing input]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/122825321</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/122825321</guid><author>Crystal_xing</author><pubDate>Tue, 08 Feb 2022 15:43:14 +0800</pubDate><description><![CDATA[使用RxFFmpeg将图片+mp3转换成mp4的时候，报此错误，后来把图片文件由jpg改成png的后缀，就好使了
]]></description><category></category></item><item><title><![CDATA[Android：Environment.getExternalStorageDirectory 废弃]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/122819580</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/122819580</guid><author>Crystal_xing</author><pubDate>Tue, 08 Feb 2022 10:57:59 +0800</pubDate><description><![CDATA[使用Android SDK 版本超过29编译会发现这个方法被废弃了，解决方案是：


context.getExternalFilesDir(）

-----------

比如要把图片保存到手机的指定文件夹下后，扫描更新媒体库，在相册中显示，存储路径的旧写法：


 //app调用系统相机拍照得到的照片存储的路径: /storage/emulated/0/Pictures/demox_camera

    private val outputPhotoDirectory: String by lazy ]]></description><category></category></item><item><title><![CDATA[Android：关于GooglePlay支付的许可测试]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/122368606</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/122368606</guid><author>Crystal_xing</author><pubDate>Fri, 07 Jan 2022 17:30:03 +0800</pubDate><description><![CDATA[官方的叙述：https://developer.android.com/google/play/billing/test

一言以蔽之，开发的时候如果想不绑定银行卡，不产生真实交易过程就测试支付功能，就需要依靠许可测试。在官方叙述的基础上，更为详尽简略的记录一些重要的细节。



1. 首先要去控制台用户级别的目录，找【设置】-【许可测试】，将测试购买的谷歌账号添加，确保【许可测试人员】上有要添加的目标账号，这才算设置好了。





2. 到应用中找【测试】-【内部测试】，上传一个内部测试的apk发布个新]]></description><category></category></item><item><title><![CDATA[Android： ViewPager+Fragment嵌套的优化]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/121993003</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/121993003</guid><author>Crystal_xing</author><pubDate>Fri, 17 Dec 2021 11:52:08 +0800</pubDate><description><![CDATA[参考如下博客做一个总结：Android开发-ViewPager嵌套Fragment卡顿解决Viewpager滑动重复加载Fragment延迟加载_Mango先生的博客-优快云博客_android viewpager滑动卡顿



首先要明确的是两个基本概念：

getFragmentManager()

所得到的是所在fragment 的父容器的管理器。

getChildFragmentManager()

所得到的是在fragment里面子容器的管理器。



getFragmentManager..]]></description><category></category></item><item><title><![CDATA[Android：Android12启动页（Splash）适配]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/121486308</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/121486308</guid><author>Crystal_xing</author><pubDate>Tue, 23 Nov 2021 09:48:52 +0800</pubDate><description><![CDATA[官方文档：启动画面 | Android 开发者 | Android Developers



用法，在自定义Splash画面的最初的周期函数（如onCreate）里调用下述方法：



    private fun extendFlash12Display() {
        val content: View = findViewById(R.id.root)
        content.viewTreeObserver.addOnPreDrawListener(
         ...]]></description><category></category></item><item><title><![CDATA[Android: 页面元素抓取工具Weditor]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/121464939</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/121464939</guid><author>Crystal_xing</author><pubDate>Mon, 22 Nov 2021 10:01:56 +0800</pubDate><description><![CDATA[在高版本mac系统电脑上，Android SDK提供的页面抓取工具uiautomatorviewer能正常打开但是无法截图，左上角的截屏按钮栏没了，故放弃uiautomatorviewer改用weditor。

 mac电脑默认安装的是python2.7，版本不够支持使用weiditor，需要自己手动安装python大于3.6的版本，参考这个博客：mac电脑安装python3.7版本 - 凝心叶子 - 博客园。安装完之后，确认python版本：







然后参考这个...]]></description><category></category></item><item><title><![CDATA[Android：Fragment中物理返回键监听]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/121282329</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/121282329</guid><author>Crystal_xing</author><pubDate>Fri, 12 Nov 2021 10:09:53 +0800</pubDate><description><![CDATA[ar dispatcher: OnBackPressedDispatcher? = null
var callback: OnBackPressedCallback? = null

dispatcher = requireActivity().onBackPressedDispatcher
callback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        if (menuI.]]></description><category></category></item><item><title><![CDATA[mac 创建加密zip]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/120848805</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/120848805</guid><author>Crystal_xing</author><pubDate>Tue, 19 Oct 2021 16:21:25 +0800</pubDate><description><![CDATA[先命令定位到桌面，并把源文件夹也放到桌面，然后按下图命令敲：



farm.zip 是设定的zip包名字，后面的是被压缩的文件夹路径
]]></description><category></category></item><item><title><![CDATA[Firebase- Performance Monitoring]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/120528440</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/120528440</guid><author>Crystal_xing</author><pubDate>Tue, 28 Sep 2021 14:27:11 +0800</pubDate><description><![CDATA[官方文档：​​​​​​https://firebase.google.com/docs/perf-mon/get-started-android#java



性能统计的集成很简单，按照官网来就行，简单来说只需要在两个gradle文件配置即可：





然后就能在控制台里看到性能统计的值了：




...]]></description><category></category></item><item><title><![CDATA[Remote: Support for password authentication was removed on August 13, 2021. Please use a personal ac]]></title><link>https://blog.youkuaiyun.com/Crystal_xing/article/details/120411619</link><guid>https://blog.youkuaiyun.com/Crystal_xing/article/details/120411619</guid><author>Crystal_xing</author><pubDate>Wed, 22 Sep 2021 11:13:30 +0800</pubDate><description><![CDATA[代码推不上去的时候报这个错，解决方案是 push的时候，输入密码的地方用token：



教程网址：

github开发人员在七夕搞事情：remote: Support for password authentication was removed on August 13, 2021._星空-优快云博客
...]]></description><category></category></item></channel></rss>