LJ的Blog

学海无涯苦做舟

0%

写在前面

Java的集合框架完备而又牛叉,其实现值得我这样的小白去一探究竟。当然了,在这我暂时不会很深入的去阅读整个集合框架,而是通过一两个实现去摸一下他的套路,希望最终我能摸到点集合框架的门路。在本文中,我将会带你阅读:

  • ArrayList内部的基本实现
  • add()方法
  • get()方法

是的,你没看错,就看这三个……当然了,ArrayList远不止如此,但现在我只会去探究一下其基本实现。

基本实现

阅读全文 »

写在前面

还记得以前在网上看到过一个LoadingDialog,感觉还挺不错的,可惜只有一个Loading,配套的错误和正确的反馈都没,一直觉得挺遗憾的,今天花了一些时间把他补全了。今天上多说找了下,找到了原来我的评论,放上原作者的文章地址。我做的事就是增强LoadingDialog的功能,新增两个自定义View。今天收到了两位前辈不错的建议,后续更新即将到来~

感谢小路同学指出我后面反馈的圆的方向和之前的方向不一致的情况,已修复,因为截gif怪麻烦的,图就不改了。。。

使用方法与效果图

展示一个loading dialog:

1
2
3
new LoadingDialog(this)
.setLoadingText("加载中...")//设置loading时显示的文字
.show();
阅读全文 »

ViewGroup的measure流程

上一篇View的工作流程——measure流程中了解到了View的measure与ViewGroup的measure流程有密不可分的联系,这次就把View的笔记做完。

ViewGroup作为容器除了完成自己的measure过程以外,还会遍历去调用所有子元素的measure方法,各个子元素再递归去执行这个过程。ViewGroup是一个抽象类没有重写onMeasure()方法,但是它提供了一个measureChildren方法。这个方法会遍历View去测量他们自身。

1
2
3
4
5
6
7
8
9
10
11
protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec){
final int size = mChildrenCount;
final View[] children = mChildren;
//对子元素遍历
for (int i = 0; i < size; ++i) {
final View child = children[i];
if ((child.mViewFlags & VISIBILITY_MASK) != GONE) {
measureChild(child, widthMeasureSpec, heightMeasureSpec);
}
}
}
阅读全文 »

写在前面

感觉最近自己需要多读书,所以在以后的一段时间里可能都是笔记形式的文了,希望自己能厚积薄发吧。

AsyncTask简介

AsyncTask是一个轻量级的异步任务类,允许你将一个耗时操作放在后台进行,并且会返回操作的结果给你。那么AsyncTask和Thread-Handler或者线程池有什么异同呢?

在AsyncTask的源码注释里这样描述:

1
2
3
4
5
/**
* <p>AsyncTask enables proper and easy use of the UI thread. This class allows to
* perform background operations and publish results on the UI thread without
* having to manipulate threads and/or handlers.</p>
*/

AsyncTask能让更加简便的使用UI线程。这个类允许执行后台操作和将结果发送到UI线程而不必操作线程和handlers。

阅读全文 »

写在前面

今天和老爸去医院了,老爸最近腰疼,幸好没什么事,各位也要多多爱惜自己的身体,等身体出了问题就来不及了。好了,闲话到此为止,话说《开发艺术探索》里面不少东西我早就看了,但是因为自己当时水平有限,而且有很多也看不大懂,所以看了忘是挺正常的事。不过感觉随着工作经验的增长,以前大学里上过《操作系统》、《计算机网络》、《数据结构》等一些课都被串到了一起,感觉很好,而且愈发能感觉到自己的不足了。这周的文主要算是一篇读书笔记吧,记一下读《开发艺术探索》第四章和View相关的笔记,至于ViewGroup我觉得还需要过段时间,在沉淀一下再来和各位一起探索一下。而且说真的,这篇文我也是硬着头皮写下来的,因为看源码看着看着发现我疑问越来越多,很多都是现阶段暂时无法解决的,不过问题总是一个一个去解决的,先过一遍View的measure流程再说其他的。

ViewRoot & DecorView

ViewRoot对应于ViewRootImpl类,在ViewRootImpl类中有如下一段注释:

1
2
3
4
/** 
* The top of a view hierarchy, implementing the needed
* protocol between View and the WindowManager.
*/
阅读全文 »

写在前面

想看的东西太多,时间总是太少~ 好了,先甩个锅给时间不够,然后开始Java重造,抱歉的是可能有些东西我不会讲的太详细。对了,最近看了同学iamxiarui的文章。

容器

在日常撸code的过程中,很多时候我们都需要在运行时去创建新的对象。在此之前,我们可能不知道所需对象的数量甚至连类型都不知道,所以我们需要一个能在运行时保存对象引用的玩意。事实上数组是保存一组对象的最有效的方式,但是很多时候我们也不知道我们需要保存的对象的数量是多少,所以数组长度固定这一限制会让我们在实际应用中受到非常多的限制。不过好在Java提供了容器来帮我们搞定这些问题。首先上一个经典的容器图谱来理解一下~

经典.jpg

阅读全文 »

写在前面

以前听说过一句话,说是** 自己写过代码总量没有超过10w行谈设计模式那都是耍流氓 **。我信了,所以一直没怎么系统的看已经买了的《Android源码设计模式》。最近有个小伙伴在群里问recyclerview怎么刷新数据,以前大概也做过,流程也就是那么两步:1.更新Adapter里数据集的引用,让他指向最新的数据集。2.调用Adapter的notifyDataSetChanged()来更新ui。之后小伙伴又问了notifyDataSetChanged()到底如何更新ui的,当时只是看出了一个观察者模式,还有一些细节没想明白。而且讲真的观察者模式的应用还是非常多的,无论是Android还是最近很火的RxJava,其中都可以看到观察者模式的身影,所以决定这周把观察者模式撸一遍。

1、什么是观察者模式

观察者模式(Observer Pattern)定义了对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新,观察者模式又叫做发布-订阅(Publish/Subscribe)模式。

定义总是这么精准而抽象,让我们结合一些Android中的场景来简单的理解一下:在Android最常用的点击事件,我们会通过设置控件的OnClickListener并传入一个OnClickListener的实现类来回调点击事件。这种我们便可以将之看做一个观察者模式。我们的OnClickListener是观察者,被观察者是控件,当有点击事件的时候控件发布点击事件,观察者OnClickListener就会接收到点击事件。当然了,说到底,就是回调。

阅读全文 »

写在前面

前段时间写了一篇MVP初尝试,由于当时只是刚接触,只是简单的实现,还有很多问题没想明白。关于内存泄露这事是本文着重要谈的一点,同时本文是我在看了很多关于Java和Android内存泄露分析的文章之后的所得。

概述

在了解MVP引起的内存泄露问题之前,我们首先要理解在Android中内存泄露是啥玩意?简单的讲内存泄漏就是** 本该被释放内存的对象没有被释放 *。最近也和同学@iamxiarui就内存泄露这个问题进行了一些讨论,最后发现要搞清楚这个东西,还要从Java层上找原因。学习Android的同学都应该知道,Java这门语言有一个垃圾回收器,一般来说我们是无需关心内存回收的问题。但是玩过LOL或者DOTA的同学都知道,一个猪队友和一个神对手究竟哪个威胁更大一些,我们不能当GC的队友,所以多了解一些这玩意吧。

在C++中会有析构函数这个概念,在C++中销毁对象必须用到这个函数,如此说来C++中是可以手动释放内存的。你可能会说Java中不也有finalize()方法吗?是的,是有这东西,让我们来看看这玩意。

finalize()

阅读全文 »

写在前面

最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量。最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过……最近感觉这对看我文的人好像不是很友好,恩,我决定改一改,尽量写的详细而有趣一些。
1.jpg

好了废话时间过了,前面也说了最近有了新任务,我现在是搞定用户信息这一块。一般来说现在用户都会有个头像什么的,光有个头像还不够,你还得能点击看个大图吧?光看个大图也不够啊,不说多的,你最起码得支持用户手势放大缩小什么的吧?当时脑海里第一个想到的是PhotoView,不过整个项目好像也只有这一块涉及到用户手势放大缩小,算了,自己实现一个吧。当然了,经常刷hongyang大神博客的我自然知道hongyang大神博客里有写过这东西。所以趁周末有空果断刷之~

实现思路

做一个东西之前我们肯定要分析需求,分析完之后我们就可以利用我们会的,或者知道可以实现但是现在不会的去尝试解决这个需求。放大缩小图片,脑子里第一个反应就是矩阵,Android里貌似有个可以通过矩阵处理图像的东西,不过说真的,以前也没有用过几次,不过好歹有个想法了。至于让图片跟随用户手势放大缩小,肯定是需要支持手势检测了。恩,我的思路暂时就是这样了,接下来先去了解一下手势检测。

阅读全文 »

写在前面

Java回炉系列也有十多天没更了,虽然心里一直没怎么放下,但是奈何有心无力。项目成堆问题在那,还好中秋得空,出去逛了一下午心情大好~好了,正文开始

多态是啥,能吃吗?

学Java一般都会听说“面向对象三大特征”:封装、继承、多态。封装是将一个事物抽象成为一个类,这个类有自己的属性和方法,某些属性和功能的实现不会对外公开,只暴露一些可供获取数据的方法。继承很容易理解,就是一个类继承另一类,这个类被称为子类,而另一个自然就是父类了。当然在有的书上也将父类称为基类,将子类称为导出类,看你个人喜好了,在我这统一称为父、子类。好了,前面说了封装和继承,现在自然是要说多态了。多态应当是一种设计的思想,然后才体现在语言的具体实现。多态的核心思想是消除类型之间的耦合关系,可能你和我一样,刚看到这句话的时候有点懵逼,没关系举个小例子:
举个栗子

现在我有个数据集,因为增删操作做的比较多,行吗,了解数据结构的你一定想到了链表。那好就用链表来搞起:

阅读全文 »