专业术语介绍

以下解释了是自的了解,详细解释可活动谷歌。

  • 本迭代:以要求优先级,在担保基本功能OK后不断开发以及升级换代,这样会降低软件开发的风险,并且能够即时化解用户举报的问题,船小好掉头嘛;

  • 霎时开发:稍加步快蒸发,大概意思就是是决不过于重视文档,要厚公开交流,能够在贯彻时高保真的还原用户的需状况,并且会很快地缓解用户之需要。

  • 单元测试:白盒测试的平等种植,对中心措施通过描写程序来测试自己之次,单元测试的目的是给你来觉察地降落程序中的耦合,保证各级一个计还是绝小单元,但立刻对测试程序逻辑是不曾帮,这是自家好之明。。。

  • 灰度发布:先期物色一有用户来运将公布的次第(这片用户可是随机抽取、制定年龄段、指定地方还是通过某种方式了解他是虎虎有生气用户),在测试的长河遭到叫跟用户一点功利被用户写用户体验报告、反馈问题相当措施来发现先后是的题材和缺点;

  • DA统计:呢被后台统计,通过在程序中埋点的方,在发出网的情形下将用户之操作行为和数据上传到后台,将每个用户之音讯还达成传回到就于老数目,通过建模对这些数量解析就是受老数额解析。

  • 开放平台:论分享到QQ空间、分享至微信、讯飞语音、友盟的后台统计、天气、地图之类都称为开放平台,它提供了一部分怒放之接口给开发者,方便开发者使用其的服务,开放平台多数服务都是免费的,但偶尔为或未安静,比如用的人头丢它当就是活不下去了,然后就不曾然后了。

  • 同行评审:汝的同行和汝一块看您的代码,发现是否有题目;

  • 结对编程:当描绘代码的经过被,有只人口以在您干或者您坐于人家干,编写边谈论,降低程序出现逻辑与初级错误的几率。

杂项改进

 Java8以String类中单独补充加了一个新办法,就是join,该办法实现了字符串的拼接,可以拿它们当split方法的逆操作。

String joined = String.join(".", "www", "cnblogs", "com");
System.out.println(joined); // www.cnblogs.com

数字包装类提供了BYTES静态方法,以byte为单位返回长度。

具备八种包装类都提供了静态的hashCode方法。

Short、Integer、Long、Float和Double这5栽档次分别提供了了sum、max和min,用来当流操作中当聚合函数下。

集合类和接口中加上的道:

统计 1

Java8为使流读取文件行及访问目录项提供了一些便的艺术(Files.linesFiles.list)。同时也供了拓展Base64编码/解码的方式。

Java8对GUI编程(JavaFX)、并发等地方为开了改善,本文没有各个列出。


转载请注明原文链接:http://www.cnblogs.com/justcooooode/p/7701260.html

Android应用开发第三正解决方案

下图也Android应用开发第三着解决方案汇总,有些可以依赖第三正值平台搞定的哪怕玩命不要自己折腾,一凡可以节省成本,二凡公未曾人家专业,原文链接:Android应用开发第三方解决方案

统计 2

老三着解决方案

参考资料

《写给大忙人看的Java SE 8》

http://study.163.com/course/introduction/1003856028.htm

https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

正文介绍Android开发过程遭到的一些基本常识,大多是一些流程、专业术语和解决问题的主意等。

接口中之默认方法与静态方法

先考虑一个题目,如何为Java中的集合库中追加方法?例如当Java
8负于Collection接口中补充加了一个forEach方法。

一旦当Java
8之前,对于接口来说,其中的方式必须还为架空方法,也就是说接口中莫允发生接口的实现,那么尽管需对每个实现Collection接口的好像都亟需实现一个forEach方法。

然立刻就会见招在给接口添加新措施的以影响了已部分实现,所以Java设计人员引入了接口默认方法,其目的是以缓解接口的改及已经部分实现不兼容的题目,接口默认方法好用作仓库、框架上兼容的一律种植手段。

默认方法就如一个一般Java方法,只是方式用default要害字修饰。

下来选一个略的例子

public interface Person {
    //默认方法
    default String getName(String name) {
        return name;
    }
}
///////////////////////////////////////////////////////////////////////
public class Student implements Person {

}
//////////////////////////////////////////////////////////////////////
public class Test {
    public static void main(String[] args) {
        Person p = new Student();
        String name = p.getName("小李");
        System.out.println(name);
    }
}

我们定义了一个Person接口,其中getName是一个默认方法。接着编写一个贯彻类似,可以由结果受到观看,虽然Student凡是空的,但是还可以兑现getName方法。

分明默认接口的面世打破了之前的片段骨干规则,使用时只要小心几只问题。

设想要接口中定义了一个默认方法,而另外一个父类或者接口中又定义了一个同名的主意,该选择哪位?

1.
选择父类中之接口。若是一个父类提供了具体的兑现方式,那么接口中有所相同名称以及参数的默认方法会吃忽视。

2.
接口冲突。要一个父接口提供了一个默认方法,而其他一个接口也提供了拥有同样名称与参数类型的办法(不管该法是否是默认方法),那么必须透过覆盖措施来化解。

难忘一个极,就是“类优先”,即当类和接口都产生一个同名方法时,只有父类中的法会由作用。

“类优先”原则得以确保跟Java
7的兼容性。如果你再接口中补充加了一个默认方法,它对Java
8以前编写的代码不见面生其他影响。

下的话说静态方法

静态方法就像一个平淡无奇Java静态方法,但方法的权限修饰只能是public或者无写。

默认方法和静态方法而Java的效益越来越助长。

以Java
8受Collection接口中即使上加了季只默认方法,stream()、parallelStream()、forEach()和removeIf()。Comparator接口也加了诸多默认方法和静态方法。

Android开发资源

参见我之任何一样首文章:Android开发者网址导航

Stream API

当处理集合时,通常会迭代所有因素并对准内部的各国一个拓展拍卖。例如,我们期待统计一个字符串类型数组中,所有长度超过3的因素。

String[] strArr = { "Java8", "new", "feature", "Stream", "API" };
        int count = 0;
        for (String s : strArr) {
            if (s.length() > 3)
                count++;
        }

日常咱们还见面采取即时段代码来统计,并没啊错误,只是她怪为难给并行计算。这吗是Java8引入大量操作符的来由,在Java8遭遇,实现平等功能的操作符如下所示:

long count = Stream.of(strArr).filter(w -> w.length() > 3).count();

stream方法会为字符串列表生成一个Streamfilter方法会返回就含字符串长度逾3底一个Stream,然后经count术计数。

一个Stream表面上与一个会合好类似,允许而转移以及获取数据,但实际也有好怪区别:

  1. Stream自己匪会见蕴藏元素。元素或受储存于底部的汇中,或者依据需要有下。
  2. Stream操作符勿会见转移来自对象。相反,他们回一个存有新结果的Stream。
  3. Stream操作符可能是推迟执行的。意思是其会等及用结果的早晚才行。

Stream相对于循环操作发生再度好之可读性。并且可并行计算:

long count = Arrays.asList(strArr).parallelStream().filter(w -> w.length() > 3).count();

只有需要把stream方法改化parallelStream,就好给Stream去并行执行过滤跟统计操作。

Stream遵循“召开什么,而不是怎去开”的规格。只需要描述得举行啊,而毫无考虑次是怎么样实现的。

Stream很像Iterator,单向,只能遍历一普。但是Stream可以独自经过一行代码就贯彻多线程的并行计算。

当用Stream时,会生出三单等级:

  1. 创立一个Stream。
  2. 于一个还是多独步骤中,将初始Stream转化及外一个Stream的中间操作
  3. 用一个停下操作来发生一个结果。该操作会强制他前面的延期操作就施行。在这之后,该Stream就非见面当被使用了。

起正在三单等级来拘禁,对许正在三种植档次的主意,首先是Stream的创办方法。

// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();

中等操作包括:map (mapToInt, flatMap 当)、
filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered。

止操作包括:forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator。

有关Stream的每个方法如何采取就不进行了,更详细的牵线看就篇文章:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

工具推荐

  • 代码对比:Beyond
    compare

  • 屏幕取色:ColorPix

  • 梯子:红杏

  • 思考导图:
    mindmanager

  • 在线工具:在线工具

函数式接口及Lambda表达式

函数式接口(Functional Interface)是单包含一个方的空洞接口。

遵循Java标准库中之java.lang.Runnable,java.util.concurrent.Callable就是卓越的函数式接口。

在Java
8中通过@FunctionalInterface注解,将一个接口标注为函数式接口,该接口只能分包一个虚幻方法。

@FunctionalInterface注解不是必的,只要接口就含有一个空洞方法,虚拟机会自动判断该接口也函数式接口。

诚如提议在接口及运用@FunctionalInterface注解进行宣示,以免他人错误地向接口中上加新点子,如果在您的接口中定义了次单泛方法吧,编译器会报错。

统计 3

函数式接口是为Java
8中的lambda而规划之,lambda表达式的措施体其实就是函数接口的实现。

怎而利用lambda表达式?

“lambda表达式”是一样截可以传递的代码,因为他得于实践同一糟糕或频繁。我们先想起一下事先以Java中一直利用的相似的代码块。

当我们于一个线程中推行有逻辑时,通常会将代码放在一个实现Runnable接口的切近的run方被,如下所示:

new Thread(new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 10; i++)
                    System.out.println("Without Lambda Expression");
            }}).start();

下一场通过创建实例来启动一个新的线程。run方法外涵盖了一个初线程中待实践的代码。

重新来拘禁其他一个例,如果想使用字符串长度排序而休是默认的字典顺序排序,就需要打定义一个实现Comparator接口的切近,然后用目标传递给sort方法。

class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}
Arrays.sort(strings, new LengthComparator());

按钮回调是任何一个例证。将回调操作放在了一个实现了监听器接口的好像的一个智吃。

JButton button = new JButton("click");

button.addActionListener(new ActionListener() {    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Without Lambda Expression");
    }
});

立即三单例证中,出现了一如既往方式,一段代码被传送让另外调用者——一个新线程、是一个排序方法要是一个按钮。这段代码会在稍后叫调用。

于Java中传送代码并无是不行容易,不容许以代码块到处传递。你不得不构建一个看似的对象,由他的某方法来含有所要的代码。

万一lambda表达式实际上即便是代码块的传递的贯彻。其语法结构如下:

(parameters)
-> expression
 或者
(parameters) -> {statements;}

括号里之参数可以望略其项目,编译器会基于上下缓来演绎参数的种,你啊堪显式地指定参数类型,如果无参数,括号内可以为空。

方法体,如果起差不多执功能语句用大括号括起来,如果只是发一行功能语句则好略大括号。

new Thread(() -> {
            for (int i = 0; i < 100; i++)
                System.out.println("Lambda Expression");
        }).start();

Comparator<String> c = (s1, s2) -> Integer.compare(s1.length(), s2.length());

button.addActionListener(e -> System.out.println("Lambda Expression"));

得视lambda表达式使代码变得简单,代替了匿名内部类。

下面的话一下措施引用,方法引用是lambda表达式的同等种简写形式。
如果lambda表达式只是调用一个特定的曾有的主意,则可用办法引用。

使用“::”操作符将方法名和目标要接近的名分隔开来。以下是四栽采取状态:

  • 靶::实例方法
  • 类似::静态方法
  • 类::实例方法
  • 类::new

    Arrays.sort(strings, String::compareToIgnoreCase);
    // 等价于
    Arrays.sort(strings, (s1, s2) -> s1.compareToIgnoreCase(s2));

地方的代码就是第三种植状况,对lambda表达式又同样潮进行了简化。

编译

通常咱们因此Eclipse或者Android
Studio开发android程序时,只需要周转程序就算好于模拟器或者机器及运行程序了,但为确保代码的完整性、能够以服务器上编译,需要通过编译工具将代码编译成apk,常见的编译工具有:ant、gradle,但当时半种编译工具还是急需经手动敲命令来成功编译功能(当然你吗可以好写脚本来实现编译自动化),jenkins凡一个不停集成的家伙,通过它们可代码克隆、编译和程序加密自动化,其实她也是由此批处理来实现的,ant、gradle和jenkins的实际用法机关谷歌,使用起来非常简短,目前android
studio和github上众多效都是由此gradle来编译的。

初的日子以及时间 API

Java8 引入了一个初的日子与日API,位于java.time包下。

初的日子以及时空API借鉴了Joda
Time
仓库,其作者为也同样人,但其并无是截然一致的,做了广大更上一层楼。

下面的话一下几只常因此底切近。首先是Instant,一个Instant对象表示时间轴上的一个接触。

Instant.now()会回到时的瞬时点(格林威治时间)。Instant.MIN和Instant.MAX分别吗十亿年前与十亿年后。

一般来说代码可以算某算法的运作时刻:

Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();

Duration对象表示两单瞬时点间的时间量。可以经过不同之办法,换算成各种时间单位。

点所说的断然时间连无可知下到生活蒙失,所以新的Java
API中提供了点儿栽人类时间,地方日期/时间带时区的年月

LocalDate凡是一个饱含年份、月份及运的日期。创建他得采用静态方法now或者of。

LocalDate today = LocalDate.now();
LocalDate myBirthday = LocalDate.of(1994, 03, 15);
// use Enum
myBirthday = LocalDate.of(1994, Month.MARCH, 15);

System.out.println(today); // 2017-10-23
System.out.println(myBirthday); // 1994-03-15

下面是LocalDate中的片常用方法:

统计 4

LocalTime表示同样上遭受的某个时刻,同样好用now或者of来创造实例。

LocalTime rightNow = LocalTime.now();
LocalTime bedTime = LocalTime.of(2, 0);
System.out.println(rightNow); // 01:26:17.139
System.out.println(bedTime); // 02:00

LocalDateTime意味着一个日子与时,用法及点类似。

上面几乎栽日期时相近都属于当地时间,下面的话一下带时区的年华。

ZonedDateTime透过安装时区的id来创造一个带时区的年月。

ZonedDateTime beijingOlympicOpenning = ZonedDateTime.of(2008, 8, 8, 20, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
System.out.println(beijingOlympicOpenning); // 2008-08-08T20:00+08:00[Asia/Shanghai]

创新后的API同样在了初的格式化类DateTimeFormatter。DateTimeFormatter提供了三种格式化方法来打印日期/时间:

  • 预定义的业内格式

    String formattered = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(beijingOlympicOpenning);
    System.out.println(formattered); // 2008-08-08T20:00:00

DateTimeFormatter类提供了多预定义的正式格式可供使用。

统计 5

  • 语言环境息息相关的格式

正规格式主要用来机器而读之光阴戳。为了吃丁会读懂日期以及岁月,你要动用语言环境有关的格式。

Java8提供了4种风格,SHORT、MEDIUM、LONG、FULL。

String formattered = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).format(beijingOlympicOpenning);
System.out.println(formattered);    //2008年8月8日 星期五 下午08时00分00秒 CST
  • 从今定义之格式

或者你吗得以自定义日期以及时间之格式。

String formattered = DateTimeFormatter.ofPattern("E yyyy-MM-dd HH:mm").format(beijingOlympicOpenning);
System.out.println(formattered); // 星期五 2008-08-08 20:00

  下图被呢局部常用之模式元素。

统计 6

初的API提供了于字符串解析出日期/时间的parse静态方法和同遗留类(java.util.Date、java.sql.Time和java.txt.DateFormat等)互相转换的点子。

软件开发流程

一个完的软件开发流程离开不开策划、交互、视觉、软件、测试、维护及营业就七独环节,这七个环节并无是孤立的,它们是开发同缓慢成功产品之前提,但各国一样件为还得以形成一个课程,是一个单独的职位,随着高效开发的风靡,以及到了体验吧王的时代,现代软件开发更多之是看重效率以及快速,而休是规矩的依这些支出流程,比如软件开发的职位不再单独是独技术岗位,它用去与前期的计划性和评审、可以在视觉与相互方面提出自己之眼光,在支付的过程被需要自测程序尽快缓解现存问题,运营和护卫的经过遭到吗要软件之拉。可见现代软件开发对开发者的综合素质(这并无是facebook所称的全栈工程师)越来越强,自称为码农或者程序猿显然是无成立之,因为此历程是头脑累与体力脑动并存,称呼自己也工程师显得愈发合理。

  • 策划:需要收集(通过用户调研、灰度发布、大数据解析、竞品分析、领导打首等方法赢得需求)、需求整理(将需分类、划分优先级等)、将急需变换成为解决方案(输出设计文档);

  • 交互:打心理学(利用性的弱项)、人性化(心智)、个性化的角度将缓解方案转换成为可交互的功力和界面(需要输出交互文档),比如加载等待、消息提示、页面布局、页面内与页面间的互相逻辑、页面切换动画等等,这个进程遭到一般会采取Axure或者PowerPoint来制造交互文档;

  • 视觉:根据交互图,使用PhotoShop来举行视觉效果,在Android上之图片格式大多是png和jpg,对于急需屏幕适配,程序同时切合做屏幕适配的地方可以动用九图,格式为*.9.png。

  • 软件:冲视觉及相互作用将急需转向为实际的实现,在实现之历程中或者会见因急需、交互或者视觉的变更造成软件实现之更动,因为策划、交互、视觉这列一个环都可能会见生信息失真的光景,或者是由于市场条件之转、获取信息不敷标准、领导打首等等情况导致软件始终处于半死不活状态,所以现在会提倡高效开发、结对编程、先后设计、同行评审、单元测试来增强程序的八面玲珑与稳定;

  • 测试:软件达到而互相的规范后,需要以可相互的先后提供测试,其中灰度发布(用户测试)、自测(开发自测)、SQA(品质保证)都算测试;

  • 护及营业:经过测试程序上稳定标准后,软件就得上线了,软件上线后,需要去维护,用户反映的题材设马上化解、用户发生疑问要立即解答;根据后台统计信息、抓住可运营的纪念日、民族文化要开运营来增进用户采取产品的粘度,让还多的用户知道、使用产品都是营业该举行的。

注:

  • 好翻此答案了解一个APP从创意到上线的切切实实流程,支出一个APP有多麻烦?

  • 得翻笔戈科技的立即首文章了解一个无线电话(平板或另电子产品也大半)的诞生需要怎么样环节,一个部手机的出生过程

提问的灵性

大部干活且是因结果吗导向的,特别是软件开发这个工作,绩效考核、KPI这些还是当考核你工作之结晶,所以做事双重多地是待您解决问题的力,至于上之事情,还是当做事外的时光去举行吧。对于提高解决问题能力我有少单建议:

  • 学会读书和思维:习的长河被使广度与深度并存,Android应用开发自己对技术基础的求未强(因为众多底的事物还被google、框架、开源代码给封装起来了,多数时节你就需要看ReadMe或者API知道怎么用便足以了),更多地是当公赶上问题之早晚知道者题材能够通过什么措施和艺术来化解。书要扣押,但基本上逛逛论坛、QQ群、Github、StackOverflow、CSDN博客专栏对好尚且是便宜的。

  • 学会提问:公身边有许多资源,比如同事、StackOverflow、QQ技术交流群、搜索引擎,当您遇到问题之上完全可利用身边的资源来解决遇到的题材,如果一个题目在一个钟头内自己都非可知缓解它们,我就是见面经搜寻引擎、Github、QQ技术交流群、同事、StackOverflow(以上排序是准优先级列的)来解决它们。如果您需要好的答案而便需有好之咨询,特别是在QQ群或者论坛,在讯问的历程被得反映出您的思想,能够透过搜寻引擎解决的问题坚决不问人家,这是针对性别人的赏识,在此处推荐几只链接,认真看会针对而产生惊人的扶助:

哪用好 Google
等搜寻引擎?

程序员应该怎么样提问?

叩问的小聪明

Smart
Questions

建议

  • 尽可能阅读官方文档,这才是原汁原味、不失真的支付指导;

  • 即使你道规划程序是浪费时间,你只是欣赏写程序,至少你也得用心想导图理清思路,思维导图对于协助你知设计文档、理清思绪来良要命的扶;

  • 不要用Intent传递大量之数目,这来或致ANR或者报生;

  • 以脱页面后,系统未肯定会立即实施onDestory方法,如果你在onDestory方法里召开关闭文件、释放内存的操作可能出现退出程序同时随即进入时,由于用再次初始化这些信导致代码重入的很;

  • 以改变JNI后,运行程序之前记得卸载掉都设置于模拟器或者真机上的拖欠次,如果直白运行,android不会见load最新编译的so,也就不克就看到修改后底效力;

  • 代码至少每天备份一不好,或者是圆一个效益就是备份一不良,不要堆放后一次性备份,因为以公的代码有题目亟待回溯代码时您用由服务器上重复取代码,同时为足以免代码不是流行导致最终及其他人合并时不知情改了哪些地方;

  • 将打印信息封装成一个道,用一个表明位控制是是法的方法体是否需要实行,这样于由debug版释放到release版本时,不待傻傻地平等执一行地失去丢代码,你就需要变更标志位之价就可了;

  • 对此生返回值的JNI函数,即使你莫归外价值,用NDK编译JNI的早晚也无见面报错,所以在写JNI代码的时光,一定要细心检查代码;

  • JNI频繁读写文件操作会影响程序的运作性能,可以考虑一次性在内存中申请一片很内存作为缓存空间,用这种空间更换时间之法子得以大大提高程序的运作效率;

  • 毫不指望类的finalize方法去处理要回收及销毁之干活,因为finalize是系统回调的章程,调用时机不可预见,切记;

  • 动文件流、Cursor时,使用完后记得一定要是关张,否则恐怕造成内存泄漏,严重的情况也许引发程序崩溃;

  • 先期采取Google搜索引擎(少用百度),如果未能够健康下Google搜索引擎建议通过代办、VPN、修改hosts文本等措施搭建梯子。这里提供一个免费的谷歌搜索引擎

  • 对非需采用硬件加速的activity(没有动画效果、视频播放以及各种多媒体文件的操作都可以合硬件加速),在AndroidManifest.xml文件中经过“android:hardwareAccelerated=”false””关掉硬件加速可省下内存;

  • 对于用横竖屏转换的采用,又休思以横竖屏切换的时候再跑onCreate方法,可以以AndroidManifest.xml文件中对应之Activity标签下调用“android:configChanges=”screenSize|orientation””;

  • 为减轻应用程序主进程的内存压力,对于耗内存比较多之界面(比如视频播放界面、flash播放界面等),可以以AndroidManifest.xml文件中对应的Activity标签下调用“android:process=”.processname””单开一个进程,但当脱离这个界面的早晚一定要以拖欠界面的onDestory方法中调用System的kill方法来好掉该过程;

  • 当res/values/arrays.xml文件被定义的么数组的因素个数不宜了死,过大会导致加载数据时那个慢,有时候你要采取数组资源时数发生或还未曾加载成功;

  • 一个Activity中极度耗费内存的是activity的背景(多数气象如此,特别是于分辨率很挺之机械,一个界面的背景竟下来还需要好几兆内存),所以于程序界面较多时,可以设想将图片转换成为静态的drawable,然后多个activity共用就无异摆放背景图;

  • 得经也application、activity自定义主题的法来关闭多接触触摸功能,只待以起定义的主题下上加这片个标签:

      <item name="android:windowEnableSplitTouch">false</item>
      <item name="android:splitMotionEvents">false</item>
    
  • 很多游乐上时,播放的片头动画多数凡一个视频文件;

  • Android单个dex文件之方法数不能够超越65536单,android使用多只dex能否避开65536术数限制?

  • 使模拟器genymotion取代android自带模拟器(它需虚拟机vituralbox的支持,不过官网曾提供了一个合一虚拟机的安包了,直接下载下来安装即可),可以大大提高使用模拟器的经验(流畅、快),它呢足以以插件的花样集成以Eclipse中,及时是视频教程

  • 让Application或者activity设置从定义主题时,最好不要设置也全透明,否则在activity按Home键回退到桌面的早晚力量异常渣;

  • 倘若你要取消toast显示的效用,在一个好像吃而就需要实例化该类一次(也就是说将Toast定义成一个大局的分子变量),这样你便足以调用mToast.cancel()了,我管其写成了一个静态类:

      public class ToastUtils {
          private ToastUtils( ){
    
          }
    
          public static void showToast( Context context, String toast ){
              if( null == mToast ){
                  mToast = Toast.makeText( context, toast, Toast.LENGTH_LONG );
              }else{
                  mToast.setText( toast );
              }
    
              mToast.show( );
          }
    
          public static void cancel( ){
              if( null != mToast ){
                  mToast.cancel( );
              }
          }
    
          public static Toast mToast = null;
      }
    
  • 公可定义一个静态类来实现防止按钮被再次点击导致更执行同一段子代码的题材:

      /**
       * 按钮重复点击
       * 
       * */
      public class BtnClickUtils {
          private BtnClickUtils( ){
    
          }           
    
          public static boolean isFastDoubleClick() {
              long time = System.currentTimeMillis();
              long timeD = time - mLastClickTime;
              if ( 0 < timeD && timeD < 1000) {   
                  return true;   
              }
    
              mLastClickTime = time;
    
              return false;   
          }
    
          private static long mLastClickTime = 0;
      }
    
  • 放在apk的assets或者raw目录下之数据文件最好做加密处理,在得动用的时刻才解密,这样可免以apk被人家破解时数吧被破解的题目;

  • 无限不用再次activity的onCreate方法中调用popupwindow的show方法,有或出于activity没有完全初始化导致程序非常(android.view.WindowManager$BadTokenException:
    Unable to add window — token null is not
    valid
    ),如果不要是于一进activity就显得popupwindow,建议就此handler.post、View.postDelay来拍卖;

  • 对自定义View,在构造方法里面凡是得不至视图的富高之(此时得丰富宽都为0),需要在onMeasure方法吃要跑了onMeasure方法后才能够抱到视图的从容高,不过你可经过在构造方法里面强制测量视图的松动高来落实以构造方法里获得视图的财大气粗高信息,具体表现MeasureSpec介绍和运用详解

  • 苟您认为在安装Eclipse后还索要配置android开发条件异常烦,你得一直以ADT
    Bundle,它是一个懒人套餐,下载下来就是足以据此了,可以于这里下载。

  • 产生时光探访阿里技巧嘉年华、InfoQ演讲和访谈、Google
    IO视频,可以学习及有些化解问题、做深品种的经验。

  • 当用被卡通比较多,并且动画都是由此图片来切换的时候,可以设想借用Cocos的机敏表单寻思,这样尽管得免图片命名的烦恼。

解决bug的方法

为写就无异桩我专门以知乎上取了一个题材:

卿来安解决bug的技巧?

以了解什么样高效解决bug之前,你待懂得什么是bug。没有成功策划、交互、视觉要求的功用,这不为bug,这给功能缺陷;一个效益就后不克健康下啊非给bug,因为其从还没上而测试的正儿八经。我当当你的主次上可测试标准之后发现的问题才叫bug。综合我要好解决bug的经历以及知乎上之报,总结常见的缓解bug的措施来(你想要迅速解决bug的前提是若会很快稳定及缺陷所当的职务,所以以下方法多数言语的凡怎么迅速定位问题,至于真的解决bug,需要而协调修改程序才行):

  • 断点调试:

以Eclipse为例:

1、打断点:

(1)打断点:

统计 7

打断点

(2)清除断点:

统计 8

散断点

2、启动调试模式的点滴种植艺术:

(1)通过debug as启动调试程序:右键工程名–>Debug AS –>Android
Application –>模拟器或者确实会弹出……watching for the
debugger……的唤醒框,不要点击等待其自行消失 –>
此时早已入调试模式,操作程序到达打断点的地方。

(2)在程序运行过程遭到,在DDMS视图下选中只要调节之程序,启动调试模式:

统计 9

DDMS视图统计进入调试模式

3、调试:请自行尝试F5、F6、F7、F8这几个调剂的快捷键;

4、watch成员变量:在调试之历程遭到,比如以实行for、while、do
while循环、递归、系统回调等程序时得以通过watch来察看成员变量或者措施返回值的转移情况,watch的艺术:

统计 10

watch

注:还多关于在Eclipse IDE中调试Android程序的文化要参见:Android
eclipse中程序调试

  • 打印:

打印调试的主意对循环、异步加载、递归、JNI等代码段很有因此,特别是在循环中,在循环次数非常大时,通过打断点调试显然是一模一样宗吃力的事情,这时候打印就显示又“智能”了,我一般会经过下面封装的打印调试类来输出打印信息,这个类似可打印print、log、行号、文件称、StrictMode等消息,当不需要打印信息时,只待用DEBUG_MODE改为false就足以了:

    import android.content.Context;
    import android.os.StrictMode;
    import android.util.Log;
    import android.widget.Toast;

    /**
     * 调试打印类
     * 
     * */
    public class DebugUtils{
        private DebugUtils( ){

        }

        public static void println( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.println( printInfo );
            }
        }

        public static void print( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.print( printInfo );
            }
        }

        public static void printLogI( String logInfo ){
            printLogI( TAG, logInfo );
        }

        public static void printLogI( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.i( tag, logInfo );
            }
        }

        public static void printLogE( String logInfo ){
            printLogE( TAG, logInfo );
        }

        public static void printLogE( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.e( tag, logInfo );
            }
        }

        public static void printLogW( String logInfo ){
            printLogW( TAG, logInfo );
        }

        public static void printLogW( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.w( tag, logInfo );
            }
        }

        public static void printLogD( String logInfo ){
            printLogD( TAG, logInfo );
        }

        public static void printLogD( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.d( tag, logInfo );
            }
        }

        public static void printLogV( String logInfo ){
            printLogV( TAG, logInfo );
        }

        public static void printLogV( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag || null != logInfo ){
                Log.v( tag, logInfo );
            }
        }

        public static void printLogWtf( String logInfo ){
            printLogWtf( TAG, logInfo );
        }

        public static void printLogWtf( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.wtf( tag, logInfo );
            }
        }

        public static void showToast( Context context, String toastInfo ){
            if( null != context && null != toastInfo ){
                Toast.makeText( context, toastInfo, Toast.LENGTH_LONG ).show( );
            }
        }

        public static void showToast( Context context, String toastInfo, int timeLen ){
            if( null != context && null != toastInfo && ( timeLen > 0 ) ){
                Toast.makeText( context, toastInfo, timeLen ).show( );
            }
        }

        public static void printBaseInfo( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; class:" ).append( stackTrace[ 1 ].getClassName( ) )
                        .append( "; method:" ).append( stackTrace[ 1 ].getMethodName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) )
                        .append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static int printLineNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
                return stackTrace[ 1 ].getLineNumber( );
            }else{
                return 0;
            }
        }

        public static void printMethod( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getMethodName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( String printInfo ){
            if( null == printInfo || !Debug.DEBUG_MODE ){
                return;
            }
            StringBuffer strBuffer = new StringBuffer( );
            StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

            strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                    .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ).append( "\n" )
                    .append( ( null != printInfo ) ? printInfo : "" );

            println( strBuffer.toString( ) );
        }

        public static void showStrictMode( ) {
            if (DebugUtils.Debug.DEBUG_MODE) {
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
            }
        }

        public static void d(String tag, String msg){
            if(DebugUtils.Debug.DEBUG_MODE){
                Log.d(tag, msg);
            }
        }

        public class Debug{
            public static final boolean DEBUG_MODE = true;
        }

        public static final String TAG = "Debug";
    }
  • 目视法:

就契合吃code
review,但是非太依仗谱,因为人的精力毕竟有限,有时候你多敲一个子公司,缩进不对都产生或引致程序出现问题,但以代码量较少时凡一个大效率的计。

  • 自动化测试:

Android的自动化测试(分白盒测试和黑盒测试)工具来:monkey、Robotium、Appium、云端测试(比如testin),具体用法而参见:

android实用测试方法之Monkey与MonkeyRunner

Robotium

Testin

Appium中文课

  • 排除法:

调节、打印、目视这三栽方法可为得复现的题材,对于自由问题(实际上不存在任意问题,只是问题未那么爱复现而已),比如在线程、音频播放、AnsynTask、Timer切换或者终止时刚好开了相应地人为操作造成出现灵异现象。这时候可以通过排除法来排查问题,具体的法子是第一大概定位及起问题的岗位,然后拿代码一段子同样段子地诠释,观察程序现象,逐步缩小出现问题之限。

本管理介绍

当可比生之软件开发过程中,可能出多单软件工程师同时开一个档次之情事,比如有担当读取数据、获取网络数据等API封装的,有负担程序架构的,有负责上层界面实现之,为了能最终编译一个完成的顺序下,需要将代码整合,这个时段最好便宜的章程就是是利用本管理工具,固定时间上传(比如每天、没转一个效等等),这样能够实时保证服务器上之代码是无与伦比完整、最新的,也可免由于自然灾害、电脑坏导致地方电脑挂掉损失掉代码的题目。

常见的本子管理工具有SVN和Git,我呢下过CVS,关于本管理工具的介绍参见:

版本控制

版本控制系统的选取的路

git教程

git简易指南

注:对windows用户来说,建议下乌龟壳系列之版本控制客户端,使用github的情侣可运用github
for windows客户端:

tortoisegit

tortoisecvs

tortoisesvn

github for
windows