<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[flowerff的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/flowerff</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; flowerff]]></copyright><item><title><![CDATA[AudioRecord api的初步认知]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/94428623</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/94428623</guid><author>flowerff</author><pubDate>Tue, 02 Jul 2019 08:43:01 +0800</pubDate><description><![CDATA[相比AudioTrack作用播音，AudioRecord的作用就是用来录音的。api也简单易懂，使用过程中根据自身需求获取相应录音通道的PCM音频数据。
1、用AudioRecord录制（read方法）下来直接保存在文件中的音频是PCM音频，也就是源音频，播放器没办法直接播放，需要转换为某一格式的音频。例如转为wave格式即可（在源文件前加44个字节来描述该音频------采样率、通道数、位宽等）...]]></description><category></category></item><item><title><![CDATA[Android Studio已经依赖了库，但是无法import]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/86618550</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/86618550</guid><author>flowerff</author><pubDate>Wed, 23 Jan 2019 22:14:46 +0800</pubDate><description><![CDATA[将项目导入到另一台电脑后明明已经依赖的库，死活无法import。
类似于implementation 'com.android.support:appcompat-v7:26.0.1’这种一大堆。可是这个库在我的代码里就是找不到类，import后面一堆红字，然后网上搜了无数方法，google()  jcenter()   mavenCentral()这三个也都在项目根目录的build.gradle...]]></description><category></category></item><item><title><![CDATA[LeakCanary还能这样？？？？（自定义保存泄漏信息）]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/86590663</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/86590663</guid><author>flowerff</author><pubDate>Tue, 22 Jan 2019 10:43:07 +0800</pubDate><description><![CDATA[对于Android开发来说，用leakcanary来检测内存泄漏很是方便与快捷的。但是由于本人工作原因，LeakCanary用起来着实无法满足需求，因为我是开发机顶盒和车机的Android系统app，这个时候系统不发弹出Notifaciton，就无法看到内存泄漏的具体信息。有人会说看源码，在show提示Notification的之前，会保存当时分析的内存快照以及结果问题，如下：

leakcana...]]></description><category></category></item><item><title><![CDATA[AIDL连接池的实现]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84319025</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84319025</guid><author>flowerff</author><pubDate>Wed, 21 Nov 2018 14:19:25 +0800</pubDate><description><![CDATA[参考《Android开发艺术探索》学习一下AIDL的连接池实现
回顾一下AIDL使用的大致流程：首先创建一个Service和一个AIDL接口，接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法，在Service的onBind方法中返回这个类的对象，然后客户端就可以绑定服务端Service，建立连接后就可以访问远程服务端的方法了。
现在考虑一种情况：公司的项目越来越庞大了，现在...]]></description><category></category></item><item><title><![CDATA[Android studio中多版本AndroidManifest文件编译打包解决]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259600</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259600</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:31:53 +0800</pubDate><description><![CDATA[前言：
在使用Android studio开发过程中，不免会遇到多版本多渠道编译apk,或者组件化，插件化开发apk。
在开发过程中，自我开发调试和发布不同版本apk时，需要频繁的去修改AndroidManifest中的配置信息，这样不仅繁琐，还增加了工作量以及错误率。所以我们可以尝试将AndroidManifest也进行多版本区分。
配置过程如下：
首先在/src/main下建两个文件夹（不一定...]]></description><category></category></item><item><title><![CDATA[MD5编码]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259587</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259587</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:31:26 +0800</pubDate><description><![CDATA[进行MD5编码，编码后的字符串肯定是唯一的，并且只会包含0-F这样的字符，符合文件的命名规则。
那么我们就写一个方法用来将字符串进行MD5编码，代码如下所示：
public&amp;nbsp;String&amp;nbsp;hashKeyForDisk(String&amp;nbsp;key)&amp;nbsp;{&amp;nbsp;&amp;nbsp;
  String&amp;nbsp;cacheKey;&amp;nbsp;&amp;nbsp;
  try&amp;nbs...]]></description><category></category></item><item><title><![CDATA[SparseArray和HashMap 了解一下]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259582</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259582</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:31:03 +0800</pubDate><description><![CDATA[引言

Android开发者对于HashMap肯定是不陌生的吧，开发过程中经常会用到。键值对应的数据储存结构。但是对于SparseArray,可能一些童鞋就没那么熟悉了。



在此之前，了解一下基础知识。

数组
数组存储区间是连续的，占用内存严重，故空间复杂的很大。但数组的二分查找时间复杂度小，为O(1)；数组的特点是：寻址容易，插入和删除困难；
链表
链表存储区间离散，占用内存比较宽松，故空...]]></description><category></category></item><item><title><![CDATA[设计模式之装饰者模式]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259572</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259572</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:30:20 +0800</pubDate><description><![CDATA[前言：
相信Java开发者在使用java i/o API的时候，对于以下代码写法应该非常熟悉：
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

在不知道具体设计实现之前，是否有人像...]]></description><category></category></item><item><title><![CDATA[设计模式之观察者模式]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259566</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259566</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:30:00 +0800</pubDate><description><![CDATA[介绍
观察者模式（Observer）完美的将观察者和被观察的对象分离开。举个例子，用户界面可以作为一个观察者，业务数据是被观察者，用户界面观察业务数据的变化，发现数据变化后，就显示在界面上。面向对象设计的一个原则是：系统中的每个类将重点放在某一个功能上，而不是其他方面。一个对象只做一件事情，并且将他做好。观察者模式在模块之间划定了清晰的界限，提高了应用程序的可维护性和重用性。
观察者设计模式定义了...]]></description><category></category></item><item><title><![CDATA[设计模式之策略模式]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259558</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259558</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:29:30 +0800</pubDate><description><![CDATA[
对于设计模式，以前虽然看过一些文章，但是总感觉差那么一点，没有系统的去学习深入一下，以致于在脑海中的思路总不是那么清晰，在项目中对于设计模式的带入感很是不强。所以在下准备静下心来好好整理一下。第一篇便是策略模式。

在百度百科上的介绍：

策略模式是指对一系列的算法定义，并将每一个算法封装起来，而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式的优点有：策略模式提供...]]></description><category></category></item><item><title><![CDATA[设计模式的六大原则]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259550</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259550</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:29:00 +0800</pubDate><description><![CDATA[1、单一职责原则（Single Responsibility Principle）
定义 : 应该有且只有一个原因引起类的变化
注意 : 这里的类不光指类,也适用于方法和接口,比如我们常说的一个方法实现一个功能
2、里氏代换原则（Liskov Substitution Principle）
定义 : 只要父类出现的地方子类就一定可以出现,而且替换为子类也不会出现任何异常或错误,使用者不需要知道是父...]]></description><category></category></item><item><title><![CDATA[网络基础]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259532</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259532</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:28:09 +0800</pubDate><description><![CDATA[1、手机能够使用联网功能是因为手机底层实现了TCP/IP协议，可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口，使上层网络数据的传输建立在“无差别”的网络之上。
TCP/IP协议主要负责数据的传输,HTTP协议负责数据的封装
2、WEB使用HTTP协议作应用层协议，以封装HTTP文本信息，然后使用TCP/IP做传输层协议将它发到网络上。
3、Socket跟TCP/IP协议...]]></description><category></category></item><item><title><![CDATA[比较浅显易懂的AIDL]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84259452</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84259452</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 20:24:28 +0800</pubDate><description><![CDATA[Binder是Android中的一种跨进程通信方式，Android的四大组件、各种Manager 和其对应ManagerService等无不与Binder挂钩。从Android Framework角度来说，Binder是ServiceManager连接ActivityManager、WindowManager等Manager和他们相应ManagerService的桥梁； 从Android 应用层来...]]></description><category></category></item><item><title><![CDATA[常见的几种排序方法实现]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/84258371</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/84258371</guid><author>flowerff</author><pubDate>Mon, 19 Nov 2018 19:11:43 +0800</pubDate><description><![CDATA[常见的几种排序方法：冒泡排序、选择排序、插入排序、选择排序
1、冒泡排序：每次比较相邻的像个数，值小的往前冒泡，时间复杂度O(n2)
2、选择排序：每次选择最小的一个数放在前面，时间复杂度O(n2)
3、插入排序：每个数插入前面的有序数列中，时间复杂度O(n2)
4、选择排序：利用递归方法，不断将小于某个数的数字放左边，大于这个数的放右边O(N*logN)
代码如下：
public class t...]]></description><category></category></item><item><title><![CDATA[利用SurfaceView实现帧动画效果，更流畅，更节约内存]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/83758695</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/83758695</guid><author>flowerff</author><pubDate>Mon, 05 Nov 2018 23:11:17 +0800</pubDate><description><![CDATA[利用SurfaceView实现帧动画效果
在开发Android做动画效果的时候，有时候UI给开发一组动画实现的帧图片，如果说图片较少（十几张）、分辨率较低（几K，十几K），用帧动画实现应该没什么问题，但是如果有几十上百张、或者几百K或者上M的图片，这个时候用帧动画来实现其实就很有问题了，内存吃紧，会卡顿，OOM等问题随之而来。
当然如果可以沟通UI改设计是最好的，但是如果非得这样做不可呢？本人就遇...]]></description><category></category></item><item><title><![CDATA[Android 收集Crash日志----UncaughtExceptionHandler]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/83029403</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/83029403</guid><author>flowerff</author><pubDate>Fri, 12 Oct 2018 16:39:22 +0800</pubDate><description><![CDATA[Android应用不可避免地会发生crash，也称之为崩溃，无论你的程序写得多么完美，总是无法完全避免crash的发生，可能是由于Android系统底层的bug，也可能是由于不充分的机型适配或者是糟糕的网络状况。当crash发生时，系统会kill掉正在执行的程序，现象就是闪退或者提示用户程序已停止运行，这对用户来说是很不友好的，也是开发者所不愿意看到的。更糟糕的是，当用户发生了crash，开发者却...]]></description><category></category></item><item><title><![CDATA[自适应控件宽高大小加载bitmap图片的友好方式]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/82981729</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/82981729</guid><author>flowerff</author><pubDate>Tue, 09 Oct 2018 14:19:54 +0800</pubDate><description><![CDATA[自动计算BitmapFactory.Options 的inSampleSize 参数。代码如下：
				int reqWidth,int reqHeight) {
	// First decode with inJustDecodeBounds=true to check dimensions
	final BitmapFactory.Options options = new BitmapFa...]]></description><category></category></item><item><title><![CDATA[针对多个帧动画相互切换且帧数较多情况的另一种实现方式，优化方案，流畅不卡顿]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/82978135</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/82978135</guid><author>flowerff</author><pubDate>Tue, 09 Oct 2018 10:07:38 +0800</pubDate><description><![CDATA[最近有一个项目，有很多组帧动画，每一组大概60帧左右，再不同的状态下回调不同的接口，动态的切换到不同的帧动画，但是不管每一帧只有10K左右，使用软引用，提前加载帧动画，这些操作都试过了，但是再切换动画的时候还是有不时的有卡顿。由于图片过多，效果异常卡顿，所以在这篇文章中就说一下帧动画的优化问题。      首先还是先来看一下android原生的帧动画的实现，代码如下:
(1)帧动画的资源文件 放入...]]></description><category></category></item><item><title><![CDATA[Android MVP模式直接用版本]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/80406434</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/80406434</guid><author>flowerff</author><pubDate>Tue, 22 May 2018 15:29:15 +0800</pubDate><description><![CDATA[引言        如果对于mvp和mvc不太熟悉的童鞋，请花一点时间阅读下面文字内容，纯手工打些本人一点粗糙的见解。或者问问度娘多多学习。熟悉者可直接跳过看干货，撸代码阶段。      在说mvp之前，相信大家应该都熟悉了mvc（model 、 view 、 control）。在Android的架构中Activity,fragment,布局的xml相当于View。然而在实际的开发过程中，Andr...]]></description><category></category></item><item><title><![CDATA[Kotlin--TODO("not implemented")异常]]></title><link>https://blog.youkuaiyun.com/flowerff/article/details/80081363</link><guid>https://blog.youkuaiyun.com/flowerff/article/details/80081363</guid><author>flowerff</author><pubDate>Wed, 25 Apr 2018 16:20:21 +0800</pubDate><description><![CDATA[   在kotlin实现接口的时候小白可能会遇到以下异常：    抛出异常：kotlin.NotImplementedError: An operation is not implemented: not implemented    在实现接口的时候IDE会自动为我们添加上：    TODO(&quot;not implemented&quot;) //To change body of created funct...]]></description><category></category></item></channel></rss>