LJ的Blog

学海无涯苦做舟

0%

前言

我开发经验比较少,这公司也不算太靠谱,由于经验尚浅,很多代码有的时候也有不少毛毛糙糙的地方,没测试,那就自己撸起袖管上吧。本文小记一下我看别人的文所得和一些翻译。

创建有效的单元测试

Building Effective Unit Tests 这个是原文地址,想看原文的可以自己看一下,下面是我自己的翻译= =,比较渣。

单元测试是在你的应用中基本的测试策略。通过创建和运行单元测试检验你的代码,你可以很容易校验个别单元的逻辑是否正确。当你重构代码时,运行单元测试能帮助你快速的修复软件和复原。

单元测试通常是反复测试尽可能小的代码单元(可以是一个方法,类或者组件)。你应该在你的app中的特定代码逻辑需要校验的时候创建单元测试。举个例子来说:如果你正在对一个类进行单元测试,你的测试可能会检查那个类是否处于一个正常的状态。通常被测试的代码单元是孤立的。你的测试仅仅影响和检测那个单元的变化。 mocking framework可以被用来使你的单元从他的依赖上隔离。

阅读全文 »

俗话说好记性不如烂笔头,此篇用来记一下常用的命令和一些操作,以后碰到啥问题也都放上来,前面的是跟着廖雪峰的教程过的。

我的mac和阿里云服务器都带git,所以安装啥的就不说了git官网地址:https://git-scm.com/ 各位可以自己去看一下。

创建一个本地仓库

  • 创建一个版本库:首先选择一个合适的地方,创建一个空目录:

    1
    $ mkdir studygit
    阅读全文 »

写在前面

最近项目里有需求要用到下拉刷新,以前写好的代码最好别动太多~在github上发现了一个XRecyclerView能满足的需求,而且也不必对我原来的代码做多大的修改。
但是光会用还不够,万一碰到啥满足不了自己需求或者是坑自己还得有办法解决啊。所以打算通过自己写一个,以此来加深自己对XRecyclerView的理解。

当然了,我只是抱着学习的目的实现一下,重复造轮子是不好的~这篇文主要是理一下自己的思路的,代码不会贴非常完整的,完整代码地址文末有。最后自己也稍微完善了一下代码,权当是练习一下自己的所学所得吧。

简单的实现部分逻辑

首先想一下我最初的需求,希望尽量少的改动自己的代码,XRecyclerView做到了这一点,他内部是有一个WrapAdapter继承于RecyclerView.Adapter。并且XRecyclerView重写了setAdapter这个方法,当你调用setAdapter方法时,会先在WrapAdapter内部持有一个adapter的引用,之后调用RecyclerView的setAdapter将这个WrapAdapter设置给RecyclerView,这么做有一个好处,就是可以自己先在onCreateViewHolder和onBindViewHolder方法里对刷新顶部和你添加的头部布局进行处理和绑定,在这之后再调用adapter的相应方法。

阅读全文 »

最近项目搞完了,有点空正好查漏补缺关于服务这一块,一直都没怎么用过,趁着这个时机学习一下至于为啥起这名呢……因为本来就想着稍微看一下Service,结果发现要看的东西越来越多……越来越多……所以就有崩了的意思……本文代码比较多,请边看边敲,碰到不懂去搜一下。

首先梳理一下我想要写的东西:

  • Service基础
  • AIDL

什么是Service

Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。服务并不是一个单独的进程,除非有特殊指明,否则Service是作为application的一部分运行在相同的进程中的。服务没有分离于主线程工作,所以当你要在服务中进行耗时操作最好开启一个新的线程来执行这种操作,避免ANR。

阅读全文 »

基于数组的ArrayList长于按索引获取对应元素,而在中间位置插入和删除元素,都涉及了对数组整体的移动、复制等操作,相比于链表的插入删除来说代价比较大。基于链表的LinkedList长于随机插入删除,Java的双向链表(LinekdList)只能从头到尾或者从尾到头遍历链表获取元素,相较于ArrayList也是比较慢的。那么有没有一种折中的解决方案,使得插入删除和取元素都比较便捷呢?我认为HashMap可以算是这么一种折中的解决方案。

HashMap概述

HashMap是一个实现了Map接口的哈希表,允许使用null值和null键。除了非同步和允许使用null之外,HashMap类与Hashtable大致相同。HashMap不保证映射的顺序,不保证该顺序恒久不变。

HashMap不是线程安全的,如果想要使用线程安全的HashMap,可以通以下代码来得到:

1
Map map = Collections.synchronizedMap(new HashMap());
阅读全文 »

啥是RecyclerView

  • A flexible view for providing a limited window into a large data set.
    一个在大小有限的窗口内展示大量数据集的view。恩,我的翻译一向不咋滴。。所以原文也放上了。

RecyclerView网上很多文都说是用来取代ListView和GridView的,事实上RecyclerView的确可以做到ListView和GridView能做的事,而且他将ViewHolder和Adapter都作为内部类,写在了RecyclerView中。先不管这把所有类都写在RecyclerView内部的做法是否好,但是ViewHolder作为RecyclerView内部复用的单位,直接避免了不必要的findViewById,而在ListView中则需要我们自己定义ViewHolder。

一个使用RecyclerView的示例

在进行探究之前,首先回顾一下我们是如何使用一个RecyclerView的。
第一步在布局文件里加上RecyclerView:

阅读全文 »

反射简介

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能成为JAVA语言的反射机制。

在《Java编程思想》中有RTTI(Run-Time Type Identification),通过运行时类型信息程序能使用基类的指针或引用来检查这些指针或引用所指对象的实际派生类型。不过RTTI的定义我是在百度百科上看到的,看了一下很多都是C++的内容,这与这本书的作者先前有C++的背景有关。不过在这里我并不想区分RTTI与我这想要学习的Java中的反射,在学习Java的过程中俺只认反射……

首先谈谈我对于反射的一些认知吧,反射对于** 客户端程序员 **来说可能并没有多大的发挥空间,而且因为反射的性能并不理想,在很多场景都是需要避免使用反射的。但是试想一下我现在要实现一个Json字符串映射到Java实体类的东西,这个时候就需要通过反射来拿到实体类的属性信息了,之后再处理Json字符串,将对应的值赋给实体类对应的属性。

在了解Java反射之前首先需要了解一个东西:Class

阅读全文 »

写在前面

本文是阅读了《图解HTTP》一文同时本周也在一个小团体内进行了一些HTTP协议的讨论,感觉对于HTTP协议的理解比以前又加深了不少。

历史

以下材料选自《图解HTTP》:

在学习Http协议之前首先看一下他的历史,也许能解答我们不少的问题。

1989年3月,互联网还只属于少数人。在这一互联网的黎明期,HTTP诞生了。CERN(欧洲核子研究组织)的蒂姆·伯纳斯-李(Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。

阅读全文 »

写在前面

最近对于接口的应用也算比较多吧,所以来总结一波我对于接口的使用和感悟。

比抽象类更加抽象

说到接口,就不得不提抽象类了。这二者有很多相似和很多不同的地方,但是要我说这二者最大的不同,就是标题了:接口比抽象类更加抽象。这个结论通常情况下都是成立的,除非你的抽象类什么都没……但是一般情况下你也不会弄这么个没意义的抽象类。一般来说在设计抽象类时都会考虑到这个抽象类应当实现什么功能和恰当的设计其抽象方法,前者是此抽象类的意义,后者通常是交给使用者去实现其需要的具体的功能。接口则不然,他只需要考虑一个类实现了这个接口的类“是怎样的”,需要我们做的就是恰当的设计一个接口该拥有哪些方法(这一点在java8之后略有不同,因为接口方法可以有默认的实现了),并不需要在接口里去具体的实现。从这一点看来接口比抽象类更加的抽象。

另外抽象类还有一个使用的技巧——防止类被实例化,这一点在《Thinking in java》中亦有提及,因为接口和抽象类都不能被实例化。这点是个概念问题,我们代码中看起来是实例化接口或者抽象类,实际上都是用的一个匿名类的对象。

解耦利器

阅读全文 »

写在前面

本文所看的源码是在idea里面查看的,一些代码和Java的源码可能有所不同……但是思想应该是一致的。
上一篇浅析ArrayList简要的了解了一下ArrayList是如何实现的,ArrayList内部是用一个Object数组对象来作为容器盛放各个对象的。而LinkedList则不然,其内部实现就类似于数据结构中的双向链表。只不过在Java中可能你不能直接使用“指针”,所以得通过Java的“引用”来实现这个双向链表。那么今天也让我们通过几个比较经典的方法来看一下其内部实现。

Node

1
2
3
4
5
6
7
8
9
10
11
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;

Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

很经典的一个数据结构……(笑)

阅读全文 »