- 博客(149)
- 资源 (15)
- 收藏
- 关注
原创 音频流式播放器AudioTrack配合WebSocket的完整案例
支持音频播放的播放器有很多,比如Android自带的MediaPlayer,第三方ExoPlayer等等。这里需要额外注意,WebSocketListener回调都是在子线程的,所以需要通知主线程的时候LiveData使用postValue。WebSocket有第三方框架可以使用,但Okhttp也已支持,考虑Okhttp项目已经是项目标配,这里就使用OKhttp的ws。因为音频流是服务端不间断的发送客户端的,HTTP 协议只能由客户端发起,所以这里选取WebSocket。本文理论涉及较少,偏向应用。
2024-08-15 11:13:50 831
原创 Kotlin委托
委托在Kotlin中占有很重要的应用,特别是属性委托比如lazy延迟初始化使用。委托模式是一项技巧,其他的几种设计模式如:策略模式、状态模式和访问者模式都是委托模式的具体场景应用。by关键字是一种约定,是对委托类的方法的约定,就是简化函数调用。这里的by约定简化了属性的get和set方法的调用,当然委托类需要定义相应的函数:getValue,setValue。...
2022-08-04 14:49:35 795 1
原创 取消ObjectAnimator动画引起的一个小问题
需求背景需求背景,取消当前的动画,重新开始倒计时动画。倒计时动画布局:<ProgressBar android:id="@+id/progress_voice" style="?android:attr/progressBarStyleHorizontal" android:layout_centerInParent="true" andr
2022-04-24 17:49:04 1292
原创 Android启动流程浅谈
一、开机启动流程:Android系统启动是由BootLoader引导开机,然后依次进入kernel、Native、Framework、App。二、冷起进程创建流程:进程的创建,主要涉及到两个进程的通信system_server进程和Zygote进程:system_server进程:是用于管理整个Java framework层,包含ActivityManager,PowerManager等各种系统服务;Zygote进程:是Android系统的首个Java进程,Zygote是所有Java进程的父进
2022-04-12 21:19:44 2962
原创 AndroidStudio通过Profiler查找内存泄漏
除了LeakCanary和mat可以帮我们排查内存泄漏,Profiler也可以,功能强大,可以进行内存、绘制、网络、电量的分析。通过view-》Tool Window -》Profiler打开工具,选择对应的进程,选择MEMORY然后点击Recorder按钮:然后筛选,就可以查看结果了。勾选 show nearest Gc root only,然后查看非weakreference的引用(weakreference是不会导致内存泄漏的),往下就能找自己项目里写的代码,一般此处就是内存泄漏点。该案
2022-02-08 14:41:37 3195
原创 fling时无法左右滑动
上下滑动的RecyclerView嵌套可以左右滑动的ViewPager。RecyclerView滑动fling时,希望能够手动左右滑动。我们首先确定fling的触发条件: @Override public boolean onTouchEvent(MotionEvent e) { ...... switch (action) { case MotionEvent.ACTION_UP: { mVelocity
2021-07-06 21:01:22 190
原创 ViewPager问题搜集
一、滑动距离设置产品,不,测试任务当前滑动下一页时,需要距离太长。默认系统的距离:try { Field field = ViewPager.class.getDeclaredField("mTouchSlop"); //修改滑动距离 field.setAccessible(true); field.setInt(this, touchSlop); //滑动长度大于150px的时候,ViewPager才进行滑动 }
2021-05-24 16:54:44 376
原创 Java final的使用
1、Java方法形参被final修饰1)final修饰基本变量如果修饰的是基本变量,基本类型的值是不能改变的/*** 对于基本类型,基本类型的值在方法内部是不能够改变的* @param i*/public static void checkInt(final int i){//编译不通过,final修饰的局部变量i的值是不能够改变的// i=10;}2)final修饰的是引用类型的变量如果修饰的是引用类型的变量,引用类型变量所指的引用是不能改变的,但引用类型变量的值是可以改变
2020-12-10 11:54:41 206
原创 Android静态变量引起的NPE
1、静态变量的优势静态变量位于虚拟机的方法区,静态变量是在类被load的时候分配内存的。当类被卸载的时候才会被销毁。2、静态变量的npe明确一件事,app不是只有在内存不足的情况下被回收,其实当应用被切换成后台的时候长久没使用,也会被系统回收的。比如在应用A页面中突然接到一个电话,在接完电话的时候,应用很可能已经被回收了,此时再次进入A页面时,是系统重新创建的,Application也可能会被重新创建。所以保存在Application、Activity、静态变量都可能为空了。其实Application
2020-12-10 11:42:54 702
原创 SimpleDateFormat性能优化
目录标题使用ThreadLocal1、重写initialValue方法2、调用set()方法赋值后台数据发现APP出现一个ANR。追踪发现是日志库SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);出现的。由于APP一旦启动就会生成大量的日志,每条日志都有日期,该代码会创建很多对象。对于一般需求改性能可以忽...
2020-01-09 16:58:22 1744
原创 JNI入门和集成现有的C代码
Android开发JNI流程JNI初始牛刀第一步,环境配置第二步,创建文件MyJNIUtils.java类第三步,生成MyJNIUtils.class类第四步,生成JNI对应的头文件第五步,实现MyJNIUtils.c文件第六步,引入动态库第七步,生成so文件第八步 CMake编写最后一步运行开发已有的c库JNI初始牛刀第一步,环境配置NDK需要下载并配置NDK路径,检测local.prop...
2019-08-19 16:11:11 438
原创 像Glide一样绑定Activity的生命周期
如何像Glide一样绑定Activity的生命周期呢,本文通过模拟Glide实现一个简单的绑定Activity生命周期的方法。本文尽量使用Glide一样的类名,删除不需要的业务,实现的思想大同小异。1、业务类RequestManager和Glide不同个,我们把业务类实现在RequestManager中,这里有几个生命周期的回调方法:onStart()、onStop()、onDestory(...
2018-12-08 15:48:04 503
原创 Android 开发之Android Studio
一、插件的安装1、alibaba java coding guidelines 2、codota 3、git安装 4、sonar二、build运行1、初探随着项目变的越来越大,特别是使用了组件化之后,build需要的时间越来越久,越来越慢了。项目现在运行一次40s,一天编译很多次的情况下,无法做任何事,是多么浪费时间。 网上一般有以下几种方式解决: 1)org.g...
2018-08-21 15:01:07 402
原创 RecyclerView的高级使用
1、ScrollView嵌入RecyclerView的处理 用NestedScrollView替代ScrollView,如下布局: <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:...
2018-07-05 21:08:47 936
原创 layout_weight的正确姿势
故事的开始是这样子的,起先我布局了一个XML文件: 想要的效果是四个控件平分该LinearLayout。首先考虑使用了layout_weight ,设置四个控件都为1。但我发现最后一个控件好像有点过分,嗯,可能是我的眼镜有问题,于是我去洗了下眼镜(洗手液洗眼镜很干净)。打开模拟器看了下,好像第三个也有点过分。于是我好像发现了什么,于是我又写了一行布局: 严重了我的猜测,是weigh...
2018-07-05 21:06:17 283
原创 RxLifecycle的使用
RxJava和RxAndroid(https://github.com/ReactiveX/RxAndroid)越来越流行,通过线程调度器很容易控制和切换线程,。但是使用的时候很容易导致内存泄露。Rxlifecycle (https://github.com/trello/RxLifecycle)就是被用来解决由于发布了一个订阅后而没有及时取消Activity/Fragment无法销毁导致的内...
2018-07-05 21:03:35 1599
原创 git的工作流程
git add .git commit -m “xxx”git checkout developgit pull -rgit checkout dsc/developgit rebase develop 可能有冲突,命令git status会提示。此时可以git diff — cached xx/xx/xx/xx.java查看冲突的详情,然后git add xx/xxx/xx...
2018-07-05 21:01:10 293
原创 发布Android library的依赖
前言jitpack.io()实现 — 此方法配合github使用比较简单。本文主要参考:jitpack官方文档实现的。第一步,创建Library首先需要一个library的项目,比如可以通过Android Studio创建,选择new module–>Android Library即可创建将要发布的library。第二步,添加插件为了能在JitPack上编译,需要添加an...
2018-04-22 12:11:10 756
原创 软键盘遮挡的解决
软键盘遮挡有两类,一类是完全遮挡,一类是遮挡一部分。 为什么会出现遮挡? 软键盘是一个dialog,有InputMethodService创建。当我们点击输入框时,系统会对当前的主窗口进行调整,以便留出相应的空间来显示该Dialog在底部。我们快速过一下源码便得知: InputMethodService继承AbstractInputMethodService,继承Service。 只挑重点过...
2018-03-29 16:55:06 1549
原创 图片下拉放大并回弹
通过扩展ScrollView实现,可以设置需要放大的View,放大系数,放大倍数,回弹时间系数package com.test.androidtest.widget;import android.animation.ObjectAnimator;import android.animation.ValueAnimator;import android.content.Context;...
2018-03-29 16:47:54 757 1
原创 Android开发模板------ViewPager(三):实现无限循环、可嵌套RecyclerView、可控制滑动速度
一、使用布局就不贴了,直接写业务逻辑:private ViewPager mPager; private LinearLayout mVPIndicate; private void initPager() { mPager = (ViewPager)findViewById(R.id.mPager); mVPIndicate = (LinearLay
2017-12-12 09:25:51 1258
原创 Android开发模板------ViewPager(一)用PagerAdapter实现图片滑动作为引导页
iewpager可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与ListView类似,我们也需要一个适配器,就是PagerAdapter。 首先看布局文件:<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_pa
2017-12-12 09:20:34 417
原创 Error: Your project contains C++ files but it is not using a supported native build system.
运行Android Studio项目出现这个问题: * What went wrong: Execution failed for task ‘:app:transformClassesWithDexForRelease’. com.android.build.api.transform.TransformException: com.android.ide.common.process.P
2017-11-02 10:08:40 870
原创 Execution failed for task ':app:transformClassesWithDexForRelease'.
运行Android Studio项目出现这个问题: * What went wrong: Execution failed for task ‘:app:transformClassesWithDexForRelease’. com.android.build.api.transform.TransformException: com.android.ide.common.process.P
2017-10-30 16:56:39 1392
原创 android studio JNI/NDK的简单使用
最近更新android sdk26(8.0)时看到NDK 15.2.4203891于是就更新了,没想到直接就把D盘干满了,只能删掉D盘一些文件了,其中包括android-ndk-r13b文件。 顺便再运行一遍记录下吧,虽然接触JNI开发的机会不多,但是偶尔有涉及,比如我们把登录的AES秘钥放到了jni里,提高了安全性,比较破解so文件比java难度高些。1、环境配置除了更新上文提到的NDK,还需要
2017-10-14 12:59:15 522
原创 Nexus私服的搭建
1、下载包安装包为:nexus-professional-2.14.5-02.jar2、安装…\nexus-professional-2.14.5-02\bin执行 nexus.bat(使用命令行)时出现: Wrapper | OpenSCmanager failed - 拒绝访问。(0x5) 请按任意键继续…切换至管理员状态下,继续执行,出现: the nexus-webapp s
2017-09-29 15:44:39 581
原创 Android上的依赖库简介
android不但可以引用jar包,而且还有自己的特殊jar包–aar压缩包。一、aar的生成方法1、直接make project生成aar在生成AAR的时候,先创建一个Library的Module,然后Build –> Make project(或者gradle clean build)就可以在build/outputs/aar下生成xxx.aar文件。 以上方法会有个问题:依赖的第三方比如de
2017-09-27 09:50:18 3429
原创 剑指Offer题目:从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字。
剑指Offer面试题 44:扑克牌的顺子 从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字。
2017-08-01 15:33:05 3100
转载 给 Android 开发者的 RxJava 详解
前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava
2017-07-25 17:45:18 716
原创 Fiddler抓取主流新闻客户端搜索url
仅仅是学习Fiddler,无商用,如有侵权请告知作者删除本文。今日头条:(webview) https://is.snssdk.com/api/2/wap/search/?from=search_tab&keyword=%E9%9B%84%E5%AE%89%E6%96%B0%E5%8C%BA&action_type=sug_keyword_search&iid=11808346515&device
2017-07-03 17:32:52 10089 4
转载 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该函数数组中数字的顺序,使得 所有奇数位于数组的前半部分,所有的数组位于数组的后半部分
2017-07-03 11:06:31 295
原创 17上半年工作总结
一、客户端的工作1、系统框架从MVC转MVPMVP是MVC的一个衍生,主要目的是为了解耦,使项目易于维护,后续功能易于扩展。在MVC模型里,更关注Model的不变,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致更改View也是比较困难的,至少那些业务逻辑是无法重用的。 在以前的版本中,随着界面及其逻辑的复杂度不断提升,Activi
2017-06-30 16:43:07 371
原创 禁止WebView返回时刷新
禁止WebView返回时刷新webview在内部跳转的新的链接的时候,发现总会在返回的时候reload()一遍,但有时候我们希望保持上个状态。 [TOC]1、两种解决办法,第一种方法如果仅仅是简单的不更新数据,可以设置: mWeb.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);2、第二种情况是从新new一个WebView开发的
2017-05-18 15:49:06 7278 2
原创 react-native的简单使用
一、网上搜集RNandroid的问题版本更新太快,到现在还没有到达版本1.0,技术并没有那么稳定使用了RN,就意味着和Google的android开发控件走上了两条不一样的路线。二、目前存在的问题1、react-native库会直接带动整个编译环境提升到最高,否则编译不了。带来的影响是新的buildtool似乎把很多以前废弃的函数直接undfine了,即可能找不到该函数了。以前的很多业务代码报
2017-03-03 16:49:55 9253
转载 android时间工具--多久之前
在开发新闻客户端的时候,是在会显示时间是多久之前,比如10分钟前,8小时前,一月前等等。 下面是一个简单的实现:
2017-02-16 10:52:51 1194
转载 在Android中使用比JSON性能高的FlatBuffers
FlatBuffers是google最新针对游戏开发退出的高性能的跨平台序列化工具,目前已经支持C++, C#, Go, Java, JavaScript, PHP, and Python (C和Ruby正在支持中),相对于json和Protocol Buffers,FlatBuffers在序列化和反序列化方面表现更为优异,而且需要的资源更少,更适合大部分移动应用的使用场景。 除了高性能和低内存消
2017-01-03 16:07:19 1753
转载 Android最佳开源库
原文:https://cloudrail.com/best-android-libraries-for-developers/ 工欲善其事,必先利其器。一个好的开发库可以快速提高开发者的工作效率,甚至让开发工作变得简单。动画 Android View Animations:一个非常强大的开源动画库,开发者可以用来创建各种效果。 RecyclerView Animators:可实现Recycl
2016-11-28 08:55:41 554
原创 Android数据库操作--greenDAO的入门使用
目前android经常用的orm框架主要有greenDAO、OrmLite、AndrORM。其中greenDAO的运行效率最高,内存消耗最少,性能最佳。 greenDAO是一个可以快速将Java对象映射到SQLite数据库的表单中的ORM解决方案。设计的主要目标:一个精简的库;性能最大化;内存开销最小化;易于使用的APIs;对Android进行高度优化。
2016-10-17 16:59:49 5392 1
原创 android系统架构MVP案例分析
前言首先我们应该避免上帝类,上帝类(比如无所不能的Activity)的维护成本很高,你很难理解正在进行的操作,并且难以测试和扩展,这就是为什么要避免创建上帝类的黄金法则。在Android开发中,如果不考虑架构的话,Activity类往往会越来越大,最大的问题就是在Activity中同时存在业务逻辑和UI逻辑,这会增加测试和维护的成本。目前流行的开发架构有MVC、MVP、MVVM等,起先使用比较多的是
2016-09-30 15:49:47 916
font awesome
2015-12-28
android DownloadManager示例
2015-06-29
loader contentprovider优化Listview
2015-05-12
开源AndroidSideMenu
2015-02-12
DragSortListView
2015-01-06
Android利用广播BroadCast监听网络的变化
2014-12-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人