android
文章平均质量分 86
Super-B
这个作者很懒,什么都没留下…
展开
-
安卓Loop机制剖析之Looper,handler
目录Looper是什么简单使用从源码了解loop原理myLooper()next()handler.dispatchMessagehandler分析消息入队同步屏障Looper是什么用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。要创建一个,在要运行循环的线程中调用 prepare(),然后调用loop()让它处理消息,直到循环停止为止。与消息循环的大多数交互是通过 Handler类进行的。意思大概就是让线程有处理消息的能力,并且这种能力是无限循环的,直到被停止为止。简单使用原创 2020-08-29 21:44:28 · 1493 阅读 · 0 评论 -
安卓Loop机制剖析之ThreadLocal
ThreadLocal是什么ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,使用这个工具类可以很简洁地编写出优美的多线程程序。简单使用解释其实还是很抽象的,下面展示一个demo,来看下threadLocal对象怎么使用的。 public void threadLocal(){ final ThreadLocal<String> t=new Thread原创 2020-08-29 18:02:54 · 394 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(4),Schedule调度器的实现
Schedule调度器rxJava的调度器还是比较复杂的,继承关系比较复杂不说,而且有很多内部类,绕来绕去的有点恶心。但是嘛,先把图画出来再说,跟着图的路线走,总不会迷路的。首先我们使用的schedule的方式就是.subscribeOn(Schedulers.io()) 那么就从这个IO()函数入口去看下,里面是个什么东西, @NonNull public static Scheduler io() { return RxJavaPlugins.onIoScheduler(IO);原创 2020-08-20 17:26:05 · 414 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(3)
subscribeOn操作符上一节我们分析了observerOn操作符,它是可以切换onNext,onComplete所在线程的,也就是事件消费的线程;这一节我们来分析subscribeOn操作符,这个操作符是用来切换createEmitter类的subscribe方法的线程的,也就是切换事件发射所在的线程。demo实例按照惯例还是用一个demo代码来说明我们的subscribeOn操作符的作用以及用法。代码如下: Log.e(TAG,"主线程ID:"+Thread.currentT原创 2020-08-18 17:58:32 · 154 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(2)
RxJava线程切换我们知道使用rxJava的最重要使用场景就是获取网络请求数据或者是数据库数据等等异步耗时操作的,所以对rxJava线程切换的掌握也十分重要,这一章我们来讲一讲rxJava的线程切换是怎么实现的。简单demo使用 Log.e(TAG,"主线程ID:"+Thread.currentThread().getId()); Observable.create(new ObservableOnSubscribe<Integer>() {原创 2020-08-17 11:11:42 · 177 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(1)
什么是RxjavaReactiveX是一个通过使用可观察序列来编写异步和基于事件的程序的库。它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O1.简单实例以上文字的描述很精炼的说出了rxJava是干啥的,以及它的优点,下面我会从简单的使用案例中去剖析rxJava的工作原理。Observable.create(new ObservableOnSubscribe<Intege原创 2020-08-15 21:28:42 · 236 阅读 · 0 评论 -
从源码分析Dialog,PopWindow为啥需要用activity的context创建,而不能用application。
目录欢迎使用Markdown编辑器Dialog的创建Dialog的show方法WMS对应窗口的管理如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器先来一张图展示,activity的结构和内容。可知 activity,phoneWindow,原创 2020-07-17 15:56:39 · 973 阅读 · 0 评论 -
安卓frame层异常错误排查
今天countly平台上出现了bug错误,日志如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.com.egova.egovamobile/cn.com.egova.egovamobile.media.CameraActivity}: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.eg原创 2020-06-01 19:21:00 · 2172 阅读 · 0 评论 -
ConstraintLayout以及FlexBoxLayout使用,布局性能测试工具
ConstraintLayout布局以及性能测试约束布局的布局方式constranitLayout布局内视图的方位介绍1 相对定位<TextView android:id="@+id/TextView1" .../><TextView android:id="@+id/TextView2" ... app:layout_co...原创 2019-11-21 16:09:59 · 1178 阅读 · 1 评论 -
Android的消息循环机制 Looper Handler类分析
Looper类说明 Looper 类用来为一个线程跑一个消息循环。 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结束了,没有循环的概念。 调用Looper类的 prepare() 方法可以为当前线程创建一个消息循环,调用loop() 方法使之处理信息,直到循环结束。 大多数和消息循环的交互是原创 2016-10-11 17:42:18 · 779 阅读 · 0 评论 -
换肤框架
在进行换肤框架讲解之前,我先把View创建过程说一下:调用Context.getSystemService()方法[java] view plain copyLayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER原创 2017-06-10 19:26:20 · 358 阅读 · 0 评论 -
Retrofit的动态代理
Java中的动态代理: 首先动态代理是区别于静态代理的,代理模式中需要代理类和实际执行类(被代理的类)同时实现一个相同的接口,并且在每个接口定义的方法前后都要加入相同的代码,这样有可能很多方法代理类都需要重复。而动态代理就是将这个步骤放入运行时的过程,一个代理类只需要实现InvocationHandler接口中的invoke方法,当需要动态代理时只需要根据接口和一个实现了Invocatio原创 2017-10-12 15:11:54 · 1390 阅读 · 0 评论 -
RxJava的源码分析
基本结构我们先来看一段最基本的代码,分析这段代码在RxJava中是如何实现的。Observable.OnSubscribe<String> onSubscriber1 = new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) {原创 2017-10-12 19:47:52 · 274 阅读 · 0 评论 -
android组件化打包module遇到的问题总结(打包成aar)
在一开始接触APICLoud平台的时候我是拒绝的,因为对于一个有着熟练的java技能,掌握着老旧设计模式的人来说,这种平台简直就是对于程序员这个职业的侮辱。第一个原因是APICLoud平台剥离了原生开发和html+js开发的职责,使得原生开发的职业方向越来越窄,开发中的地位也逐渐下降;第二个原因是,这个平台完全是无脑式开发,所有的js框架都是封装好的,只需要像jQuery一样直接调用就好了,API...原创 2018-04-28 11:36:24 · 14537 阅读 · 0 评论 -
微信小程序自定义组件TabLayout(类似于今日头条的滑动菜单)
有了安卓开发经验,自定义微信小程序组件简直易如反掌。 自定义微信小程序的步骤如下:建立四个文件 分别是逻辑控制js,配置文件json,布局文件wxml,样式文件wxss。配置文件.json的编写 component参数:说明这个文件夹是组件文件夹; usingComponents参数:说明该组件是依赖于什么组件的,这里是空的什么都不依赖。.wxml文件...原创 2018-05-07 14:47:09 · 3875 阅读 · 0 评论 -
适配安卓(Android)7.0文件系统
注: 安卓6.0是权限管理的变更,要想使用危险权限,必须代码中主动请求相关权限;到了安卓7.0中,即使你主动请求了读写权限,你不一定能够读取你想要的文件,因为7.0的文件系统加密了,使用方式和以前不同了,如果app不能即使的兼容7.0的新特性,很可能会导致应用崩溃。安卓7.0文件系统应用程序通常需要将其一个或多个文件提供给其他应用程序。例如,图片库可能希望为图像编辑人员提供文件,或者...原创 2018-06-03 12:45:07 · 1868 阅读 · 0 评论 -
Android studio 3+版本解决gradle的疑难杂症
新建项目就出错。 报 appt 插件错误 在该文件中配置: 然后把 gradle版本降低到3.0.1gradle插件和gradle build tool版本对应规则如下:原创 2018-07-30 11:13:08 · 1404 阅读 · 0 评论 -
compileSdkVersion,targetSdkVersion和minSdkVersion三者的关系
**compileSdkVersion,targetSdkVersion和minSdkVersion***compileSdkVersion*定义应用程序编译选择哪个Android SDK版本,通常compileSDKVersion属性值被设置为最新的API版本,例如:25,改变compileSDKVersion的属性值不会影响Android系统运行行为,比如说,将属性值设...原创 2018-07-30 16:13:29 · 13958 阅读 · 1 评论 -
安卓8.0以上系统的通知栏适配
安卓8.0以上系统的通知栏适配安卓的通知栏在发展过程中,主要经历了三个阶段,安卓3.0以下——>安卓3.0到安卓8.0以下——>安卓8.0以上。在3.0之前创建通知栏也很简单 NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_...原创 2018-11-16 18:19:08 · 625 阅读 · 0 评论 -
关于recycleview内部嵌套expandlistview的问题
1.expandlistview的高度不能铺满到recycleview的item中,就需要重写expandlistview的onmeasure方法:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 解决显示不全的问题 int expand...原创 2019-03-14 16:56:55 · 613 阅读 · 0 评论 -
安卓Spinner控件的Bug
Spinner控件可以监听,但是监听的话,如果两次点击都是同一个item的话,那么就就不会触发,因为看源码的话就会发现,在Spinner中有一个保存上次点击的位置的变量叫做 mOldSelectedPosition的变量,每次点击的时候就会验证两次点击是否是同一个item,不同就触发点击事件,因此可以修改mOldSelectedPosition变量,让控件两次点击相同都可以触发。但是私有变量也原创 2016-07-15 14:28:04 · 1099 阅读 · 0 评论 -
报错:”Gradle error : Write access is allowed from event dispatch thread only in android studio
最近换电脑了,新安装了一个android studio 编译原来的工程发现出现了Gradle error : Write access is allowed from event dispatch thread only in android studio错误去百度了一通,发现找不到答案,在stackoverflow中发现答案:So the problem was conc原创 2016-12-07 15:35:08 · 15556 阅读 · 0 评论 -
AppCompatActivity和Activity主题问题
AppCompatActivity和Activity的主题设置问题想要这些活动没有标题栏,那么就必须在manifest.xml文件中设置Application的主题为:android:theme="@android:style/Theme.NoTitleBar"然后再需要标题栏的活动中设置自己需要的标题栏然而AppCompatActivity这个狗比东西非要标题栏才不会原创 2016-07-14 12:46:57 · 4975 阅读 · 3 评论 -
从编译角度看java域和方法
上图展示了,我们java类是如何从java字节码文件中加载到内存中,再从内存中解析到方法区中的。java域的编译而我们的java域初始化是在解析和初始化这两个阶段完成的,解析先把域中基本类型和String类型初始化为0和“”,域中引用类型初始化为null(系统默认设置),然后在初始化阶段进行和的初始化(用户代码设置)。 而域又分为静态域和非静态域。 静态域:在中初始化,属于类变量被存储在方法区中原创 2017-07-09 15:07:24 · 788 阅读 · 0 评论 -
android studio的配置版本号和名称
今天做更新app的功能,其他的没啥问题,就是在获取安装的app版本的时候出现了问题,我去manifest.xml文件中查找versioncode和versionname的时候,发现没有错误啊,就是1.1啊,网络版本也是啊,大印log日志的时候发现大印出来的本地version是1.0。我真是日了狗了,明明配置的是1.1获取的确是1.0。后来我仔细看了一眼versionname的时候上面是黄色原创 2016-08-25 13:43:27 · 1582 阅读 · 0 评论 -
自定义图片视图的坑
/** * Created by fxl on 2016/8/22. */public class RoundImageView extends ImageView { /** * 图片的类型,圆形or圆角 */ private int type; private static final int TYPE_CIRCLE = 0; pri原创 2016-08-25 00:25:43 · 337 阅读 · 0 评论 -
解决软键盘弹起导致gridview的布局错乱的方法(转载)
一、问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示:转载 2016-08-11 17:53:52 · 1245 阅读 · 0 评论 -
记录开发项目遇到的问题
1.不同机型的适配问题2.不同版本的安卓系统获取权限的问题,获取资源的uri问题3.不同版本的activity主题兼容问题4.抽取Activity基类(包含最基本的刷新,删除,广播,数据存取等接口)5.播放器手势监听冲突,横竖屏,activity重绘,fragment抽取基类(用于恢复现场)。6.不同版本的网络请求session共享。7.框架的水土不服,及时调整和项目的契合原创 2016-08-30 22:32:47 · 455 阅读 · 0 评论 -
StateListDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
报这个错误是在我的自定义imageview里面产生的,由于自己用了picasso框架,最先还以为是picasso的图片加载到我的控件中格式错误,最后发现我在填充自定义imageview的时候,错误和默认图片都是xml格式的图片,StateListDrawable就是这个格式的图片,而在我的ondraw函数里面我是直接getdraw得到图片的,如果服务器不存在图片的话,默认的xmL文件就会填充图片,原创 2016-08-18 11:11:24 · 6689 阅读 · 3 评论 -
listview多个子样式的回收复用问题
如图所示:listview的滑动,都会带出新的new_item出现,old_item移出屏幕的时候会被回收,new_item其实就是old_item,这个item就是getview的convertview参数,现在假设这样一种情况,一共有4种布局,最开始的三项都是不同的样式,如下图所示:就前三项占据了一屏幕了,后面都是一样的第四类布局,这样如果使用回收机制的话,原创 2016-06-17 14:01:17 · 900 阅读 · 0 评论 -
在引入layout文件的时候出现resourse not found的解决问题
出现这个问题,会出现iinflate view_layout.xml at XX Line,not found resourse #00f40ffX ,归根到底就是说资源找不到,这里找不到分很多种:1.资源不存在,这个就需要在XML文件里面一一查找引用的资源,看存不存在。2.即使你已经找到了引用的资源了,也没有用,因为在AS工具里面,同名的文件不会覆盖,只会放在同一文件夹里面原创 2016-07-14 16:16:00 · 1397 阅读 · 0 评论 -
安卓里面的Inflate的作用以及注意事项
没为ViewPager第2个pager设置view所以报的空异常。inflate控件加载注意空指针:1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。获得 LayoutInflater 实例的三种方式转载 2016-07-12 18:39:06 · 3528 阅读 · 0 评论 -
volley网络请求保持sessionID
既然我们可以对Volley的XXXRequest以及Httppstack的改写,那么我们在第一次请求服务器的时候,就可以把服务器发送过来的sessionID保存下来。在app周期内怎么存取sessionID呢?万一我们app退出了怎么办?下次怎么自动登陆呢?我们知道安卓的跟随app周期的数据只能放在application中。所以第一步就是保存在application中。如果我们有需原创 2016-06-28 12:27:58 · 884 阅读 · 0 评论 -
Java NIO和IO的主要区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NIO面向流 面向缓冲阻塞IO转载 2016-10-14 15:53:38 · 327 阅读 · 0 评论 -
webview滑动没有惯性
只需要在webview外面加上一个scrollview就可以了原创 2016-12-13 15:14:27 · 2537 阅读 · 4 评论 -
从编译过程看内部类和lambda表达式
什么是内部类内部类按名称分为:匿名内部类,和非匿名内部类。 非匿名内部类又分为:静态内部类和非静态内部类。有时候我们会发现,修改外部类的某个方法使得它访问了内部类的某个方法,编译之后就会发现字节码中会多出来一个额外的方法,所以为了了解原理,还是要看看编译期间它到底做了什么。第一点我们都知道,内部类在编译期间会被编译成一个和外部类一样的顶级类。1 静态内部类/非静态内部类的区别 静态内部类/非静态原创 2017-07-09 13:36:30 · 3003 阅读 · 5 评论 -
从编译过程看java的泛型
为什么需要泛型?在1.5之前是没有泛型的,而通常使用object来泛化我们所有的对象,这样做也可以让我们达到泛型的目的,但是在代码编写的过程中很容易出现类型转换的错误,这种错误在编译期间是不知道的,只有到运行期间才知道。 比如: List list=new List(); list.add("aaaa"); list.add(12); int a= (int) list.ge原创 2017-07-09 12:30:14 · 2171 阅读 · 0 评论 -
换肤框架的资源
换肤需要对应的资源,那么资源有哪些来源呢?1.apk打包的时候,有几个默认的资源被打包进APK中。2.从网络下载,放到指定的路径。根据上一章的SkinManager的内容:@Overrideprotected Resources doInBackground(String... params) { try { if (params.leng原创 2017-06-11 14:35:04 · 580 阅读 · 0 评论 -
Volley框架的理解以及自定义各个对象
Volley框架的基本流程就是:我们在代码中RequestQueuequeue 是这样写的:StringRequestrequest = new StringRequest(URL, new Response.Listener() { @Override public void onResponse(String s) {原创 2016-06-27 21:55:25 · 664 阅读 · 0 评论 -
理解AsyncTask的工作原理
Android中子线程主要有AsyncTask、IntentService、HandlerThread。来看一看AsyncTask的原理,在使用的时候,AsyncTask在4.1版本之前是需要在主线程内创建的,4.1之后就可以随便在哪里创建了,原因在于AsyncTask和主线程通信也是通过mainlooper的handler发送消息实现的,因此可以知道第一次使用的时候需要创建和主线程相关的ha原创 2017-07-02 16:41:58 · 429 阅读 · 0 评论