2013年12月26日星期四

Android代码优化工具——Android lint - 张兴业

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Android代码优化工具――Android lint - 张兴业  阅读原文»

作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常,lint就能解决我们的这些问题。Android lint是在ADT 16提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题,主要包括:

1)布局性能(以前是 layoutopt工具,可以解决无用布局、嵌套太多、布局太多)

2)未使用到资源

3)不一致的数组大小

4)国际化问题(硬编码)

5)图标的问题(重复的图标,错误的大小)

6)可用性问题(如不指定的文本字段的输入型)

7)manifest文件的错误

Android lint可以解决如上的问题,当然还有更多,具体的可以参考Android Lint ChecksAndroid官方也总结了lint能解决的问题,如下图。

lint是命令工具,它已经完美的集成到了Eclipse中,我们可以方便的使用。通过lint,我们可以检测出每个问题的说明和问题的严重性,根据检测报告可以对程序作出改进。下面介绍下在Eclipse怎么使用lint。

lint的使用可以通过两个途径,Eclipse左上角的打钩的按钮或者选择项目->右键->Android Tools,如下图所示:


图一 图二

lint工具简单实用,自动化分析,分析完成会给我们分析报告:

分析包括中会包括错误和警告,会给出具体的描述、类别、位置。上图是一个错误的描述,下图给出警告描述。


Android lint是对android开发者很有帮助的一款工具,对于项目打包发布前优化代码、查找没用到的资源、查找错误等非常有帮助。作为开发者是必须掌握的工具之一,如果想了解更多可以参考lint

/**
* @author 张兴业
* http://blog.csdn.net/xyz_lmn
* iOS入门群:83702688
* android开发进阶群:241395671
* 我的新浪微博:@张兴业TBOW
*/

参考:

http://tools.android.com/tips/lint

http://tools.android.com/tips/lint-checks

http://developer.android.com/tools/help/lint.html

http://developer.android.com/tools/debugging/improving-w-lint.html


本文链接:http://www.cnblogs.com/xyzlmn/p/3493776.html,转载请注明。

Spring MongoDB Support - dempe  阅读原文»

spring对mongoDB的支持包括以下特征:

  • mongodb在spring中的配置支持注解 @Configuration和xml的方式
  • MongoTemplate辅助类扩展了Mongo operations的生产效率,提供了document和pojo类型之间的转换

添加依赖到pom.xml

<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
</dependencies>

  

你可以将日志级别设置成debug来查看更多的日志信息

log4j.category.org.springframework.data.document.mongodb=DEBUG
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n

 

app-mongodb.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<context:property-placeholder location="classpath:mongo.properties" />

<!-- Default bean name is 'mongo' -->
<mongo:mongo host="${mongo.host}" port="${mongo.port}">
<mongo:options connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
auto-connect-retry="${mongo.autoConnectRetry}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}"
slave-ok="${mongo.slaveOk}"
write-number="1"
write-timeout="0"
write-fsync="true" />
</mongo:mongo>

<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-ref="mongo" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>

<!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 -->
<mongo:mapping-converter base-package="com.dempe.summer.*.model" />

<!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
<mongo:repositories base-package="com.dempe.summer.*.persist"/>

</beans>

  Person.java

package com.dempe.summer.person.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

/**
*
@author: Zheng Dongping
*
@version 1.0 date: 2013-12-20
*/
@Document(collection
= "person")
public class Person {

@Id
private String id;
private String name;
private Integer age;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}

How the '_id' field is handled in the mapping layer

mongoDB默认会为所有的document生成_id字段,MongoMappingConverter类有确定的规则去管理从java类到"_id"字段的映射,

当一个字段被@Id注解标注,或者这个字段的名字为id,那么这个字段将会为映射成"_id"

PersonRepository.javapackage com.dempe.summer.person.persist;

import java.util.List;

import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import com.dempe.summer.person.model.Person;

/**
* @author: Zheng Dongping
* @version 1.0 date: 2013-12-20
*/
public interface PersonRepository extends MongoRepository<Person, ObjectId> {

// 这里的?0代表方法里面的第一个参数
@Query("{ 'name':?0}")
public List<Person> findByName(String name);

}

 PersonController.java

package com.dempe.summer.person.controller;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.dempe.summer.person.model.Person;
import com.dempe.summer.person.persist.PersonRepository;

/**
* @author: Zheng Dongping
* @version 1.0 date: 2013-12-20
*/
@Controller
@RequestMapping(value = "/person")
public class PersonController {

@Inject
PersonRepository repository;

@RequestMapping(value = "/test")
@ResponseBody
public String testMongo() {
// repository.deleteAll();
Person person = new Person();
person.setId("12234499");
person.setName("dempe");
person.setAge(3);
repository.save(person);
Person p = new Person();
p.setId("2222");
p.setName("dempe");
p.setAge(4);
repository.save(p);

List<Person> person2List = repository.findByName("dempe");
System.out.println("person2:" + person2List.get(0).getName() + person2List.size());
return "success";
}

}

  

重写默认的mapping来定制自己的convert

为了更细粒度的去控制映射的过程,你可以实现MappingMongoConverter来定制自己的自己的convert


本文链接:http://www.cnblogs.com/dempe/p/3484190.html,转载请注明。

阅读更多内容

没有评论:

发表评论