<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[孫小逗]]></title><description><![CDATA[根本沒有正確的選擇，我們只能靠奮鬥來使當初的選擇顯得正確！]]></description><link>https://blog.youkuaiyun.com/guodongAndroid</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; guodongAndroid]]></copyright><item><title><![CDATA[Java并发编程-Java内存模型(JMM)]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124971361</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124971361</guid><author>guodongAndroid</author><pubDate>Wed, 25 May 2022 18:29:20 +0800</pubDate><description><![CDATA[前言
在上一章 Java并发编程-Android的UI框架为什么是单线程的？ 中笔者介绍了并发编程线程安全「三大恶」：「可见性」、「原子性」以及「有序性」
广义上来说，并发编程问题笔者归纳为：是由于后续操作看不到前面操作的结果而引发的
首先「大恶-可见性」顾名思义，即线程B能否看见线程A对共享变量的操作结果
其次「二恶-原子性」CPU 指令/操作被中断/分割，广义上看笔者认为也是可见性问题，比如线程 A 修改共享变量 x += 1 时被中断，去执行线程 B x = 40 ，线程 A 恢复执行时可能看不到 x]]></description><category></category></item><item><title><![CDATA[Kotlin-KCP的应用-修改SDK版本号]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124935263</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124935263</guid><author>guodongAndroid</author><pubDate>Mon, 23 May 2022 21:17:30 +0800</pubDate><description><![CDATA[背景
在 SDK 开发中，一般会暴露获取 SDK 版本号的接口，获取的版本号一般为 String 类型，比如：
// sdk接口
interface Sdk {
    fun getVersion(): String
}

// sdk调用方
sdk.getVersion()

上述方式可以通过在 gradle.properties 中配置版本号，然后在 build.gradle 中读取版本号生成至 BuildConfig.java 中，例如：
// gradle.properties
VERSION=1]]></description><category></category></item><item><title><![CDATA[Java并发编程-Android的UI框架为什么是单线程的]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124835756</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124835756</guid><author>guodongAndroid</author><pubDate>Wed, 18 May 2022 09:59:40 +0800</pubDate><description><![CDATA[前言
众所周知，Android 会在 ViewRootImpl 中调用 checkThread 方法检测是否是在 UI 线程中更新 UI
// ViewRootImpl.java

final Thread mThread;

public ViewRootImpl(Context context, Display display) {
    mThread = Thread.currentThread();
}

void checkThread() {
    if (mThread != Threa]]></description><category></category></item><item><title><![CDATA[Kotlin-KCP的应用-第二篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124730714</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124730714</guid><author>guodongAndroid</author><pubDate>Thu, 12 May 2022 14:35:46 +0800</pubDate><description><![CDATA[前言
接Kotlin-KCP的应用-第一篇，本文是第二篇，以下是本文的目标：

记录如何简单搭建 KCP 开发环境
使用 KCP 解决第一篇中的问题

何为KCP？为何不使用KSP？
KSP
KSP 即 Kotlin Symbol Processing(Kotlin符号处理器)，KSP 目前只能生成代码，不能修改字节码，第一篇中的问题需要修改字节码，因此 KSP 不能满足需求
KCP
KCP 即 Kotlin Compiler Plugin(Kotlin编译器插件)，在 kotlinc  过程中提供 hoo]]></description><category></category></item><item><title><![CDATA[Kotlin-KCP的应用-第一篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124647937</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124647937</guid><author>guodongAndroid</author><pubDate>Sun, 08 May 2022 14:39:35 +0800</pubDate><description><![CDATA[前言
KCP的应用计划分两篇，本文是第一篇
本文主要记录从发现问题到使用KCP解决问题的折腾过程，下一篇记录KCP的应用
背景
Kotlin 号称百分百兼容 Java ，所以在 Kotlin 中一些修饰符，比如 internal ，在编译后放在纯 Java 的项目中使用(没有Kotlin环境)，Java 仍然可以访问被 internal 修饰的类、方法、字段等
在使用 Kotlin 开发过程中需要对外提供 SDK 包，在 SDK 中有一些 API 不想被外部调用，并且已经添加了 internal 修饰，但是]]></description><category></category></item><item><title><![CDATA[Android-TextView跑马灯探秘]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124623296</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124623296</guid><author>guodongAndroid</author><pubDate>Sat, 07 May 2022 09:01:20 +0800</pubDate><description><![CDATA[前言
自定义View实现的跑马灯一直没有实现类似 Android TextView 的跑马灯首尾相接的效果，所以一直想看看Android TextView 的跑马灯是如何实现
本文主要探秘 Android TextView 的跑马灯实现原理及实现自下往上效果的跑马灯
探秘
TextView#onDraw
原生 Android TextView 如何设置开启跑马灯效果，此处不再描述
View 的绘制都在 onDraw 方法中，这里直接查看 TextView#onDraw() 方法，删减一些不关心的代码
pro]]></description><category></category></item><item><title><![CDATA[修改linphone-sdk-android-第四篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124445166</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124445166</guid><author>guodongAndroid</author><pubDate>Wed, 27 Apr 2022 10:33:00 +0800</pubDate><description><![CDATA[背景
在使用linphone-sdk-android过程中，发现当有一起呼叫在通话中时，又收到一起呼叫，会莫名其妙的播报振铃声音，问题是已经调用linphone-sdk-android提供的接口关闭了振铃声音
// 关闭Ring
mCore.setRing(null);
mCore.setRingback(null);
mCore.setRemoteRingbackTone(null);
mCore.setNativeRingingEnabled(false);
mCore.setRingDuringInc]]></description><category></category></item><item><title><![CDATA[修改linphone-sdk-android-下篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124438152</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124438152</guid><author>guodongAndroid</author><pubDate>Tue, 26 Apr 2022 21:48:19 +0800</pubDate><description><![CDATA[前言
接上篇修改linphone-sdk-android-上篇
接中篇修改linphone-sdk-android-中篇
本文是下篇，本篇记录在上篇中提到的问题1排查过程及修复方案，尽量描述排查问题过程中的思路与方向
上篇中说问题1当初认为是linphone的bug，后面看源码及查资料发现可能不是bug，本篇将记录个人的理解
问题
这里再描述下问题1：打开音频编解码G722、G729等时，发起呼叫的INVITE SDP中，没有G722、G729的rtpmap
m=audio 7078 RTP/AVP 96 ]]></description><category></category></item><item><title><![CDATA[修改linphone-sdk-android-中篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124433750</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124433750</guid><author>guodongAndroid</author><pubDate>Tue, 26 Apr 2022 18:06:22 +0800</pubDate><description><![CDATA[前言
接上篇修改linphone-sdk-android-上篇
本文是中篇，本篇记录问题2的后续排查过程及修复方案，尽量描述排查问题过程中的思路与方向
分析
上篇说到增加日志，编译后放到AS中运行，查看Logcat输出
// up不为NULL
2022-04-24 18:10:36.969 4002-4018/com.guodong.android.linphone D/guodongAndroid: up = 0x100433
2022-04-24 18:10:36.969 4002-4018/com.g]]></description><category></category></item><item><title><![CDATA[修改linphone-sdk-android-上篇]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124424993</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124424993</guid><author>guodongAndroid</author><pubDate>Tue, 26 Apr 2022 12:24:46 +0800</pubDate><description><![CDATA[前言
记录修改linphone-sdk-android过程，计划分为上、中、下三篇
本文是上篇，本篇仅记录下书问题2的初步排查过程，尽量描述排查问题过程中的思路与方向
余下两篇记录问题1、2的修改过程
背景
接上文编译linphone-sdk-android
项目中使用的linphone-sdk-android版本为4.5.x，使用过程中发现以下两个问题：

打开音频编解码G722、G729时，发起呼叫的INVITE SDP中，没有G722、G729的RTP MAP，当时以为是linphone的bug，后面]]></description><category></category></item><item><title><![CDATA[编译linphone-sdk-android]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/124424931</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/124424931</guid><author>guodongAndroid</author><pubDate>Tue, 26 Apr 2022 12:20:48 +0800</pubDate><description><![CDATA[编译环境
系统 Ubuntu 20.04.4 LTS  2核4G 50G存储 i5-8250U 1.60Ghz
Android SDK r24.4.1
Android NDK r18b
Linphone SDK  Release 4.5
CMake 3.16.3
Python 3.8.10
Git 2.15.1
Java 1.8.0_312
Android环境准备
安装 Android SDK NDK cmdline-tools
NDK：https://developer.android.google.cn]]></description><category></category></item><item><title><![CDATA[AndroidStudio中使用Aliyun Maven]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/74598095</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/74598095</guid><author>guodongAndroid</author><pubDate>Thu, 06 Jul 2017 19:18:36 +0800</pubDate><description><![CDATA[转载请注明出处 
  http://blog.youkuaiyun.com/guodongAndroid/article/details/74598095 
  本文来自【孫小逗的博客】
AndroidStudio中使用Aliyun MavenAliyun Maven地址：http://maven.aliyun.com在项目级别的build.gradle中添加如下Maven地址：buildscript {]]></description><category></category></item><item><title><![CDATA[使用秒级编译方案-Freeline]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/54174776</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/54174776</guid><author>guodongAndroid</author><pubDate>Sat, 07 Jan 2017 15:37:34 +0800</pubDate><description><![CDATA[转载请注明出处 
  http://blog.youkuaiyun.com/guodongandroid/article/details/54174776 
  本文来自【孫小逗的博客】
使用秒级编译方案-Freeline一、关于FreelineFreeline是蚂蚁金服旗下开发的一个基于动态替换的编译方案，运用到项目后可以极大的提高项目编译速度。相比较现在的instant-run，buck，layoutcas]]></description><category></category></item><item><title><![CDATA[View滑动冲突的两种解决方式]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/52530227</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/52530227</guid><author>guodongAndroid</author><pubDate>Tue, 13 Sep 2016 22:21:59 +0800</pubDate><description><![CDATA[View滑动冲突的两种解决方式1、外部拦截法所谓外部拦截法是指点击事件都先经过父容器的拦截处理，如果父容器需要此事件就拦截，如果不需要此事件就不拦截，这样就可以解决滑动冲突问题，这种方法比较符合点击事件的分发机制。外部拦截法需要重写父容器的onInterceptTouchEvent方法，在内部做相应的拦截即可，这种方法的伪代码如下所示：    @Override
    public boolean]]></description><category></category></item><item><title><![CDATA[单元素的枚举类型已经成为实现Singleton的最佳方法]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/52032750</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/52032750</guid><author>guodongAndroid</author><pubDate>Tue, 26 Jul 2016 09:41:20 +0800</pubDate><description><![CDATA[一、概述Singleton模式是在编程实践中应用最广泛的几种设计模式之一。以前常用的是下面的这种方法：public class Singleton
{
    private volatile static Singleton instance;    private Singleton(){};    public static Singleton getInstance()
    {]]></description><category></category></item><item><title><![CDATA[Android事件分发、拦截与处理的理解]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/51727272</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/51727272</guid><author>guodongAndroid</author><pubDate>Tue, 21 Jun 2016 14:48:47 +0800</pubDate><description><![CDATA[转载请注明出处 
  http://blog.youkuaiyun.com/guodongAndroid/article/details/51727272 
  本文来自【孫小逗的博客】
一、概述昨天，某位黑同学问了个很奇葩的问题：禁止ViewPager的左右滑动。好吧，被问到的一瞬间就想是不是他傻X。ViewPager不滑动，干嘛还要用ViewPager，唉，无语。无语归无语，事情还是要干的。随手给他写了个自]]></description><category></category></item><item><title><![CDATA[Android中关于scrollBy的一点点心得]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/51558131</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/51558131</guid><author>guodongAndroid</author><pubDate>Wed, 01 Jun 2016 18:37:55 +0800</pubDate><description><![CDATA[转载请注明出处 
  http://blog.youkuaiyun.com/guodongandroid/article/details/51558131 
  本文来自【孫小逗的博客】
一、概述最近对自定义View和动画进行了研究学习，同时之前不太明白的地方也豁然开朗。学习不是一下子就学会的，不懂的地方，在后续的学习过程中会慢慢的理解，有种拨云见日的感觉。 
scrollBy(int dx, int dy)主]]></description><category></category></item><item><title><![CDATA[记Android Studio自定义属性访问不了的问题]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/51536091</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/51536091</guid><author>guodongAndroid</author><pubDate>Mon, 30 May 2016 10:30:38 +0800</pubDate><description><![CDATA[一、概述在Eclipse中对于自定义属性的引用是在根布局文件中声明一个命名空间，比如：xmlns：xxx=“http://schemas.android.com/apk/res/项目包名”。其中xxx是自己定义的，项目包名就是Manifest文件中的package。而在Android Studio中声明命名控件和在Eclipse中类似，例如：xmlns:wzq=”http://schemas.and]]></description><category></category></item><item><title><![CDATA[仿IOS版QQ水滴下拉刷新,添加上拉加载、左滑删除]]></title><link>https://blog.youkuaiyun.com/guodongAndroid/article/details/51516451</link><guid>https://blog.youkuaiyun.com/guodongAndroid/article/details/51516451</guid><author>guodongAndroid</author><pubDate>Fri, 27 May 2016 14:26:29 +0800</pubDate><description><![CDATA[1、概述哈，对于我这样的菜鸟来说，看着大神们的博客总想啥子时候自己也能写博客啊。别说你不知道有哪些大神？好吧，比如，我一直关注的鸿神,还有让我买了第一本Android书籍的郭大侠。好了，就说这些吧。效果如下：2、整合前面已经说了，像我这样学了不到1年Android的菜鸟哪会写这么高大上的控件啊。菜鸟就得站在巨人的肩膀上的飞啊。言过正传，其实看到这个效果大家肯定不陌生，其实这是两个控件的结合体，哪两个]]></description><category></category></item></channel></rss>