<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lipeiyong1993的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_33232521</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_33232521]]></copyright><item><title><![CDATA[2 files found with path ‘lib/armeabi-v7a/libopencv_java3.so‘ from inputs]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/131473083</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/131473083</guid><author>qq_33232521</author><pubDate>Fri, 30 Jun 2023 11:32:40 +0800</pubDate><description><![CDATA[2 files found with path ]]></description><category></category></item><item><title><![CDATA[Android DiffUtil 导致索引越界异常]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/118155255</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/118155255</guid><author>qq_33232521</author><pubDate>Wed, 23 Jun 2021 16:01:13 +0800</pubDate><description><![CDATA[节能刷新
移动设备屏幕大小有限（不得不说我是顽固的小屏爱好者，大于5.5寸难以接受，时代已经抛弃我了哈哈），列表（List）可以说是一个出现非常高频的交互设计。大多数情况下我们的列表不仅仅是一次性加载本地数据，而要应付来自网络的各种动态内容，可能是增加、删除等操作。
在Android开发中，一个耳熟能详的方法就是 notifyDataSetChanged ，在适配器（Adapter）的设计模式下，每当我们的列表数据发生变更时，就需要调用此方法来更新UI。然而，这个方法并不“节能”，它会同时刷新列表中的所有i]]></description><category></category></item><item><title><![CDATA[Android 实现TextView第一行嵌入图片]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/115519100</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/115519100</guid><author>qq_33232521</author><pubDate>Thu, 08 Apr 2021 14:13:42 +0800</pubDate><description><![CDATA[效果

代码
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;layout&gt;
    &lt;data&gt;

    &lt;/data&gt;
    &lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.an]]></description><category></category></item><item><title><![CDATA[动态修改 Retrofit 的url]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/115464788</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/115464788</guid><author>qq_33232521</author><pubDate>Tue, 06 Apr 2021 16:53:44 +0800</pubDate><description><![CDATA[这里采用的是反射的方式
步骤一：通过反射直接修改baseUrl
步骤二：情况缓存的数据（Retrofit会把之前调用过的接口的一些信息通过一个Map对象缓存起来）
    @Singleton
    @Provides
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }

    @Singleton
    @Pro]]></description><category></category></item><item><title><![CDATA[android 混淆 minifyEnabled proguard-rules.pro consumer-rules.pro]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/114919455</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/114919455</guid><author>qq_33232521</author><pubDate>Wed, 17 Mar 2021 13:53:53 +0800</pubDate><description><![CDATA[名词解释
minifyEnabled 是否启动混淆 ture:打开   false:关闭
proguard-rules.pro 文件是给Library模块自己使用的混淆规则
consumer-rules.pro文件则是会合并到app的混淆规则中，是给包括app在内的其他模块调用时使用的混淆规则
应用场景
我们自己新建一个Library给主工程引用
引入三方Library给项目主工程引用
这种情况下，一般我们需要对Library中的代码配置一些混淆规则，以免打混淆包某些方法不生效而无法使用。
一、在APP模块]]></description><category></category></item><item><title><![CDATA[Dagger2 通过构造函数初始化异常]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/110132442</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/110132442</guid><author>qq_33232521</author><pubDate>Wed, 25 Nov 2020 15:37:00 +0800</pubDate><description><![CDATA[今天修改完代码后一编译就报错，Dagger编译不过。最终定位到构造函数加了抛出异常导致的，代码如下：
    @Inject
    public Detection(AppExecutors appExecutors) throws IllegalAccessException {
        this.appExecutors = appExecutors;
        boolean initSuccess = DetectionGpio.init();
        if (!initSu]]></description><category></category></item><item><title><![CDATA[Room 数据库版本迁移后 Is the db closed？]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/109994471</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/109994471</guid><author>qq_33232521</author><pubDate>Mon, 23 Nov 2020 14:04:20 +0800</pubDate><description><![CDATA[记录一下，折腾了小半天。
现象：
数据库表增加一个字段，从而数据库版本从2迁移到3。第一次运行就提示数据库已关闭，重启后恢复正常。
结果：
当前room版本是1.1.0；更新到1.1.1后问题解决
错误信息
11-23 14:02:36.910 2809-2859/com.furlingtech.printer E/ROOM: Cannot run invalidation tracker. Is the db closed?
    java.lang.IllegalStateException: Can]]></description><category></category></item><item><title><![CDATA[List遍历for、foreach和iterator选择]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/109617419</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/109617419</guid><author>qq_33232521</author><pubDate>Wed, 11 Nov 2020 13:59:10 +0800</pubDate><description><![CDATA[结果
ArrayList：for&gt;iterator&gt;foreach
LinkedList:iterator&gt;foreach&gt;for
原因
1.foreach是用iterator来实现的，所以不展开说明。
2.接下来分析一下ArrayList和LinkedList的数据结构上的区别。
ArrayList是基于(index)的数组，在内存上是连续存储，所以获取指定数据的比较快，时间复杂度是O(1)。
LinkedList是以链表形式存储的，每个元素都会存放下一个元素的节点坐标，所以用fo]]></description><category></category></item><item><title><![CDATA[Android 组件化]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/108844901</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/108844901</guid><author>qq_33232521</author><pubDate>Fri, 16 Oct 2020 14:50:41 +0800</pubDate><description><![CDATA[大类：
1、各个模块的版本号统一管理，避免不同模块版本号冲突
2、各模块加资源前缀限制
3、公共类放入libcommon
4、模块之间通信采用alibaba的ARouter
主要使用技术：
1、AndroidX
2、Databinding
3、LiveData+ViewModel
4、Room
5、Dagger2
6、Glide
7、Okhttp+Retrofit2
8、ZXing
9、Gson\FastJson
编码规范：
采用Alibaba Java Coding Guidelines plugin s]]></description><category></category></item><item><title><![CDATA[Android 自定义ProgressBar]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/108616038</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/108616038</guid><author>qq_33232521</author><pubDate>Wed, 16 Sep 2020 10:10:55 +0800</pubDate><description><![CDATA[package com.furlingtech.printer.utils;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import andr]]></description><category></category></item><item><title><![CDATA[Android 自定义View的属性使用Databing]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/108615891</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/108615891</guid><author>qq_33232521</author><pubDate>Wed, 16 Sep 2020 10:07:14 +0800</pubDate><description><![CDATA[在自定义View中，属性使用databing。
1.自定义属性
  &lt;declare-styleable name="CustomProgressBar"&gt;
        &lt;attr name="android:progress"/&gt;
  &lt;/declare-styleable&gt;

2.自定义控件中给该属性设置set
public void setProgress(int progress) {
    mProgress = progress;
    postInv]]></description><category></category></item><item><title><![CDATA[git-移除某个文件夹的版本控制]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/107553133</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/107553133</guid><author>qq_33232521</author><pubDate>Fri, 24 Jul 2020 09:07:11 +0800</pubDate><description><![CDATA[git rm -r -n --cached “app/build”  //-n 表示预览需要删除版本控制的文件列表
git rm -r  --cached “app/build”  //执行删除命令
git commit -m “remove app/build” //提交
git push origin master   //提交到远程服务器主分支


...]]></description><category></category></item><item><title><![CDATA[AndroidStudio子线程无法debug调试]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/107360122</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/107360122</guid><author>qq_33232521</author><pubDate>Wed, 15 Jul 2020 14:37:01 +0800</pubDate><description><![CDATA[今天接手的一个老项目需要修改tcp接收的协议，之前是一次都没有跑过。
跑起来后其他一切都正常，但调试tcp需要断点进入子线程，奇怪的就是无法进入。
习惯性的百度、google，给出的解决方法几乎一直，如下

设置好后记得需要重新编译一下，否则不生效。
上面的方法对我却不生效，折腾了半天发现minifyEnabled设置为了true，修改为false就好了


...]]></description><category></category></item><item><title><![CDATA[ABIs [armeabi] are not supported for platform. Supported ABIs are [arm64-v8a, armeabi-v7a, x86, x86_]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/105841274</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/105841274</guid><author>qq_33232521</author><pubDate>Wed, 29 Apr 2020 15:38:31 +0800</pubDate><description><![CDATA[ABIs [armeabi] are not supported for platform. Supported ABIs are [arm64-v8a, armeabi-v7a, x86, x86_64].

)
随着AndroidStudio版本的更新，自带的NDK版本也越来越高。NDK17及以后就不在支持ABIs[armeabi]。
解决方案是下载低版本的NDK

...]]></description><category></category></item><item><title><![CDATA[Android内部和外部存储解析]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/101428995</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/101428995</guid><author>qq_33232521</author><pubDate>Thu, 26 Sep 2019 19:33:41 +0800</pubDate><description><![CDATA[Android的开发离不开数据的存储，然后在之前的开发中一直没有搞清楚，是应该要好好梳理梳理了。
以下引用来自对官方文档的理解

安卓手机的存储分为 2 部分，内部存储 ( Internal ) 和外部存储
( External )
内部存储指的是系统存储空间，需要root权限才能访问，像SharedPreferenced和


...]]></description><category></category></item><item><title><![CDATA[Android手机隐藏底部导航栏]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/101364754</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/101364754</guid><author>qq_33232521</author><pubDate>Wed, 25 Sep 2019 14:48:09 +0800</pubDate><description><![CDATA[先要条件：已具有root权限
所需工具类
public class ShellCommand {

    private final static String COMMAND_SU = "su";
    private final static String COMMAND_SH = "sh";
    private final static String COMMAND_EXIT = "...]]></description><category></category></item><item><title><![CDATA[接口多格式数据解析]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/101363637</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/101363637</guid><author>qq_33232521</author><pubDate>Wed, 25 Sep 2019 14:36:05 +0800</pubDate><description><![CDATA[前因：由于项目功能的增加，所需要接人的后台接口也不只一个，返回格式的差异化也不可避免。
思路：接口返回时我们所必须的值分别是Http status code、HTTP status message or null if unknown、和body。当我们在接收数据时先把数据转换为JsonObject，然后在CallAdapterFactory中转换为指定格式
new Retrofit.Builde...]]></description><category></category></item><item><title><![CDATA[OkHttp拦截器的一些骚操作]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/99681826</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/99681826</guid><author>qq_33232521</author><pubDate>Fri, 16 Aug 2019 17:06:01 +0800</pubDate><description><![CDATA[1.URL重定向
2.请求体数据加密
3.HEAD动态添加
4.请求日志抓取
URL重定向
如何重定向，说白了就是更换个新的网址，但是一般服务端做比较好，客户端就显得有些鸡肋。但是这个东西日常也会有用到，比如一些场景，测试生成环境的切换。业务多了，几个人混合开发的后台，每个人的代码不同意导致了baseURL时还不同，这时候可以通过一个入口来修改就行，不然每个地方都去修改，接口量大的话会很麻烦。
自...]]></description><category></category></item><item><title><![CDATA[LivaData所遇到的一些问题]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/97004450</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/97004450</guid><author>qq_33232521</author><pubDate>Tue, 23 Jul 2019 16:19:38 +0800</pubDate><description><![CDATA[LiveData&lt;ApiResult&lt;ModelPicture&gt;&gt; apiRequest = apiService.getModelPicture();
MediatorLiveData&lt;Bitmap&gt; livedata = new MediatorLiveData&lt;&gt;()
livedata.addSource(apiRequest,modelPic...]]></description><category></category></item><item><title><![CDATA[Node.js 命令]]></title><link>https://blog.youkuaiyun.com/qq_33232521/article/details/96438754</link><guid>https://blog.youkuaiyun.com/qq_33232521/article/details/96438754</guid><author>qq_33232521</author><pubDate>Thu, 18 Jul 2019 17:31:09 +0800</pubDate><description><![CDATA[启动服务
forever start -a server.js
停止服务
forever stop server.js

]]></description><category></category></item></channel></rss>