<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ithouse的专栏]]></title><description><![CDATA[大道至简 返璞归真]]></description><link>https://blog.youkuaiyun.com/ithouse</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ithouse]]></copyright><item><title><![CDATA[使用WPF实现一个快速切换JDK版本的客户端工具]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/142632484</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/142632484</guid><author>ithouse</author><pubDate>Sun, 29 Sep 2024 12:02:35 +0800</pubDate><description><![CDATA[发现网上一键切换JDK环境的方法都是在mac或Linux下的，本人主力电脑是Windows，于是看了一下WPF的文档，自己开发了一个客户端。github链接：https://github.com/ITAnt/JavaSwitch。安装文件在根目录的release文件夹。]]></description><category></category></item><item><title><![CDATA[10年Android应用开发感想（Compose会是未来吗？）]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/142134947</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/142134947</guid><author>ithouse</author><pubDate>Wed, 11 Sep 2024 14:32:13 +0800</pubDate><description><![CDATA[比如在View销毁了，但对象没销毁的情况，举个例子：Navigation + Fragment的场景，就避不开onDestroyView()执行了，但onDestroy()却没执行，虽然MVP也可以在onDestroyView()的时候去清空P层的View引用，但数据恢复还是不太方便，诸如屏幕旋转等场景，要去恢复对话框等数据是比较棘手的。如果让我新开一个公司级别的项目，我还是会选择MVVM，而不是Compose，理由：丰富的传统原生开发经验，有把握迅速开发各种界面和稳定的功能，有信心保证代码的质量。]]></description><category></category></item><item><title><![CDATA[PJSIP编译]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/123086871</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/123086871</guid><author>ithouse</author><pubDate>Wed, 23 Feb 2022 11:53:39 +0800</pubDate><description><![CDATA[必须使用Linux编译，不要在Windows上浪费时间，编译好了再把so拷贝出来Windows即可。没有Linux？virtualbox搞一个Ubuntu不是什么难事，网速快的话半小时搞定。
源码目录说明
目录：
lib: [PJPROJECT的lib库]
pjlib:[基础框架库]
pjlib-util:[辅助工具库]
pjmedia:[开源的媒体栈]
pjnath:[开源的NAT-T辅助库]
pjsip:[开源的SIP协议栈]
pjsip-apps[demo]
配置准备
VirtualBox6.1
Ub]]></description><category></category></item><item><title><![CDATA[高德地图定位相关]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/121393807</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/121393807</guid><author>ithouse</author><pubDate>Thu, 18 Nov 2021 09:52:02 +0800</pubDate><description><![CDATA[AMapUtils有一些计算测量相关的工具方法
/**
 * (官方)计算两点之间的距离（米）
 */
public static float calculateLineDistance(double lat1, double lng1, double lat2, double lng2) {
    lng1 *= 0.01745329251994329D;
    lat1 *= 0.01745329251994329D;
    lng2 *= 0.01745329251994329D;
    la]]></description><category></category></item><item><title><![CDATA[Android开发规范参考Java版]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/121089560</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/121089560</guid><author>ithouse</author><pubDate>Mon, 01 Nov 2021 21:42:14 +0800</pubDate><description><![CDATA[Android开发规范参考（Java版）
一、命名风格
1.类名使用 UpperCamelCase 风格
不要中英文混合（通用拼音除外，如Beijing等），以每个单词首字母大写。
2.方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
驼峰命名法，第一个单词首字母要小写，其他单词首字母大写。
①为区分成员变量和局部变量，可以在书写成员变量时，第一个字母用m(member)，其他单词遵循驼峰命名法，如mName。注意在写实体类时则不能用m表示member，因为实体类一般都是纯变]]></description><category></category></item><item><title><![CDATA[记一次高德地图导致的句柄泄漏问题]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/120707715</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/120707715</guid><author>ithouse</author><pubDate>Mon, 11 Oct 2021 17:26:32 +0800</pubDate><description><![CDATA[Android应用开发过程中，内存泄漏是最常见的，句柄泄漏是怎么回事呢？当出现 Too many open files异常的时候，意味着文件句柄泄漏过多，句柄泄漏到一定数量之后（一般是接近1024）会导致程序卡死、文件读写异常、socket创建异常等。
一般来说单一进程的最大可打开文件句柄数量为1024，可通过cat proc/进程ID/limits查看。
概念：Fd的全称是File descriptor,在linux OS里，所有都可以抽象成文件，比如普通的文件、目录、块设备、字符设备、socket、管道]]></description><category></category></item><item><title><![CDATA[Kotlin那些让人相见恨晚的小技巧]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/120176664</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/120176664</guid><author>ithouse</author><pubDate>Wed, 08 Sep 2021 11:41:34 +0800</pubDate><description><![CDATA[Kotlin那些让人相见恨晚的小技巧
1.扩展
方法名左边写个类名加个点，就像钻进这个类的源码改了它里面代码一样，左边的类表示哪个类可以调用这个扩展函数。扩展是一种静态行为，对被扩展的类代码本身不会造成任何影响。
fun receiverType.functionName(params){
    body
}


receiverType：表示函数的接收者，也就是函数扩展的对象
functionName：扩展函数的名称
params：扩展函数的参数，可以为NULL

防止快速点击
/**
 * 防止快速点]]></description><category></category></item><item><title><![CDATA[女朋友说系统自带音乐播放器太臃肿不好用，用Kotlin捋了个本地音乐播放器]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/119488355</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/119488355</guid><author>ithouse</author><pubDate>Sat, 07 Aug 2021 16:23:55 +0800</pubDate><description><![CDATA[代码结构：

这一次也是将MVP与JetPack进行了一个融合，这个框架断断续续维护了有大半年，写起逻辑来非常快且清晰，开源看一下示例：
/**
 * 展示某个歌手的所有歌曲
 */
class ArtistSongActivity : MusicActivity&lt;ActivityArtistSongBinding&gt;() {
    private val songList = arrayListOf&lt;SongBean&gt;()
    private lateinit var mAda]]></description><category></category></item><item><title><![CDATA[Jenkins使用之安卓原生项目]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/117435961</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/117435961</guid><author>ithouse</author><pubDate>Tue, 01 Jun 2021 18:33:00 +0800</pubDate><description><![CDATA[目的：提交代码 --&gt; Gitlab --&gt; webhook --&gt; Jenkins拉取代码并打包 --&gt; 打包完成发布到蒲公英
一、准备工作
① 最好在局域网准备一台专门用于运行Jenkins的电脑。

]]></description><category></category></item><item><title><![CDATA[解决Flutter安卓端启动白屏的问题]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/116856331</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/116856331</guid><author>ithouse</author><pubDate>Sat, 15 May 2021 17:21:56 +0800</pubDate><description><![CDATA[修改主题：
styles.xml
&lt;style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"&gt;
    &lt;!-- Show a splash screen on the activity. Automatically removed when
         Flutter draws its first frame --&gt;
    &lt;item name="android:windowBac]]></description><category></category></item><item><title><![CDATA[Android获取本地视频文件缩略图时导致视频播放失败]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/89284208</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/89284208</guid><author>ithouse</author><pubDate>Sat, 20 Jun 2020 20:25:20 +0800</pubDate><description><![CDATA[方案一：播放视频时取消缩略图的加载。
缺点：应用层实现治标不治本，还是有几率出现。
方案二：源码层实现，交给底层开发人员，应该是video so库出问题了（如libMtkOmxVdec.so）。

...]]></description><category></category></item><item><title><![CDATA[GoogleDrive视频直链播放]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/85782157</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/85782157</guid><author>ithouse</author><pubDate>Sat, 20 Jun 2020 19:58:20 +0800</pubDate><description><![CDATA[String url = file.getDownloadUrl();
String token = GoogleDriveManager.getInstance().getCredential().getToken();

package com.itant.videotest;

import android.content.Context;
import android.media.Medi...]]></description><category></category></item><item><title><![CDATA[获取Netflix ESN]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/87969818</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/87969818</guid><author>ithouse</author><pubDate>Sat, 20 Jun 2020 19:01:16 +0800</pubDate><description><![CDATA[import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Handler;
impor...]]></description><category></category></item><item><title><![CDATA[Flutter官方国际化方案]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/106567502</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/106567502</guid><author>ithouse</author><pubDate>Fri, 05 Jun 2020 11:48:42 +0800</pubDate><description><![CDATA[1.安装插件
File --&gt; Settings… --&gt; Plugins --&gt; 搜索“flutter Intl”，安装该插件，重启AndroidStudio
2.配置与初始化

配置
pubspec.yaml文件新增本地化依赖：

dependencies:
    // Other dependencies...
    flutter_localizations:
        sdk: flutter

然后package get获取该依赖

工程初始化
在菜单栏的Tool下找]]></description><category></category></item><item><title><![CDATA[Flutter(Dart)开发规范及相关技巧总结]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/106541059</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/106541059</guid><author>ithouse</author><pubDate>Thu, 04 Jun 2020 17:45:01 +0800</pubDate><description><![CDATA[基础规范篇


文件命名
文件名有多个单词的话，需要使用下划线进行分割，且单词均为小写。


字符串相关
①普通字符串建议使用单引号括起来，而不是双引号，当然非要使用双引号也是没有错误的，习惯问题。


②使用三个引号(三个单引号或三个双引号都可以)创建多行字符串
String str = '''Hello
                         Dart''';

③使用r创建原始raw字符串
// 如果没有r，则转义字符会生效(换行)
 String rawStr = r'Hello \n D]]></description><category></category></item><item><title><![CDATA[服务器开发优化]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/102513355</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/102513355</guid><author>ithouse</author><pubDate>Sat, 12 Oct 2019 19:22:19 +0800</pubDate><description><![CDATA[tomcat优化（1GB内存的机子）
https://www.cnblogs.com/centos2017/p/9956432.html
https://cloud.tencent.com/developer/article/1463754
在catalina.sh文件中，找到cygwin=false，在这一行的前面加入参数，具体如下：
JAVA_OPTS="-server -Xms256m -X...]]></description><category></category></item><item><title><![CDATA[从阿里云购买免费SSL证书之后部署到Tomcat以支持https]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/100588517</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/100588517</guid><author>ithouse</author><pubDate>Sat, 07 Sep 2019 00:38:26 +0800</pubDate><description><![CDATA[首先按照阿里云的免费SSL证书然后按要求验证和下载，没有什么大坑，需要注意的是
① 我选择的是文件验证，因为我不是在阿里云买的服务器和域名，需要在tomcat/webapps目录下新建文件夹.well-known，注意前面有个点.，这个文件夹是隐藏的，直接cd进去，再建一个文件夹pki-validation，把文件上传上去，然后再继续验证。
② 每次下载都会产生新密码，该密码仅匹配本次下载的证书。...]]></description><category></category></item><item><title><![CDATA[TV开发焦点跑飞的问题]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/100095340</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/100095340</guid><author>ithouse</author><pubDate>Tue, 27 Aug 2019 11:10:26 +0800</pubDate><description><![CDATA[在使用TV开发时，有可以提供使用的leanback类库里的VerticalGridView等代替手机上的RecyclerView，但实际开发中，经常还是要用到RecyclerView，RecyclerView虽然强大，在TV上却经常遇到焦点跑飞的情况，原因：
RecyclerView在长按遥控器的情况下会导致Item的焦点丢失或者说是飞到别的控件上。主要是因为RecyclerView设置适配器，将...]]></description><category></category></item><item><title><![CDATA[Linux下SVN服务器搭建]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/95588852</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/95588852</guid><author>ithouse</author><pubDate>Fri, 12 Jul 2019 09:36:31 +0800</pubDate><description><![CDATA[svnserve --version

如果提示“未找到命令”，就安装：
yum install -y subversion

重新验证。
新建一个目录作为SVN存放代码的位置：
如果当前在~目录下，mkdir svnserver之后则会有
~/svnserver/

cd ~/svnserver

新建一个项目：
svnadmin create DemoProject
cd DemoProjec...]]></description><category></category></item><item><title><![CDATA[工厂模式的实现]]></title><link>https://blog.youkuaiyun.com/ithouse/article/details/93590797</link><guid>https://blog.youkuaiyun.com/ithouse/article/details/93590797</guid><author>ithouse</author><pubDate>Tue, 25 Jun 2019 10:03:12 +0800</pubDate><description><![CDATA[工厂模式是一种设计思想，它适用于需要创建多个具体实例的场景，并且这些实例都具有一个共同的方法（动作）。比如，“发送信息”。我们都知道，发送信息的方式有很多种，但无论是用微信发送，还是用邮件发送，它们都有一个共同的动作，就是“发送”，那么可以把这个动作(send)抽象出来。
1.普通工厂模式
抽象的动作：
package com.itant.pattern.sender;
public interf...]]></description><category></category></item></channel></rss>