[转载]介绍4款json的java类库 及 其性能测试 - windlaughing - 博客园

mikel阅读(1179)

[转载]介绍4款json的java类库 及 其性能测试 – windlaughing – 博客园.

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming LanguageStandard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。

下面介绍四款处理json的java类库:Json-lib、Gson、Jackson、Fastjson

一、Json-lib

JSON-lib is a java library for transforming beans, maps, collections, java arrays and XML to JSON and back again to beans and DynaBeans. 官网:http://json-lib.sourceforge.net/

maven依赖配置:

复制代码
         <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
复制代码

示例:

复制代码
    /**
     * 将对象序列化成json字符串
     * @param obj
     * @return
     */
    public static String bean2Json(Object obj){
        JSONObject jsonObject=JSONObject.fromObject(obj);
        return jsonObject.toString();
    }

    /**
     * 将json字符串反序列化为对象
     * @param jsonStr
     * @param objClass 反序列化为该类的对象
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return (T)JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass);
    }
复制代码

 

二、Gson

Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.

官网:https://code.google.com/p/google-gson/

maven依赖:

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>

示例:

复制代码
    public static String bean2Json(Object obj){
        Gson gson = new GsonBuilder().create();
        return gson.toJson(obj);
    }

    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        Gson gson = new GsonBuilder().create();
        return gson.fromJson(jsonStr, objClass);
    }

    /**
     * 把混乱的json字符串整理成缩进的json字符串
     * @param uglyJsonStr
     * @return
     */
    public static String jsonFormatter(String uglyJsonStr){
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(uglyJsonStr);
        String prettyJsonString = gson.toJson(je);
        return prettyJsonString;
    }
复制代码

 

三、Jackson

Jackson is a high-performance JSON processor (parser, generator)。官网:http://jackson.codehaus.org/Home

maven依赖:

<dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

示例:

复制代码
public static String bean2Json(Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        StringWriter sw = new StringWriter();
        JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
        mapper.writeValue(gen, obj);
        gen.close();
        return sw.toString();
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
            throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(jsonStr, objClass);
    }
复制代码

 

四、FastJson

Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。网址:https://github.com/alibaba/fastjson

maven依赖配置:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.35</version>
        </dependency>

示例:

复制代码
    public static String bean2Json(Object obj){
        return JSON.toJSONString(obj);
    }

    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return JSON.parseObject(jsonStr, objClass);
    }
复制代码

 

 

五、性能测试

1、Java对象序列化为Json字符串:

执行100 0000次转换,各个类库的耗时如下:(以秒为单位)

Gson 48.891s
Json-lib 311.446s
Jackson 19.439s
FastJson 21.706

2、Json字符串 反序列化为Java对象

执行100 0000次转换,各个类库的耗时如下:(以秒为单位)

Gson 39.280s
Json-lib 使用该类库的方法进行转换时(测试代码见下面),抛出异常。其原因是Person类的属性:List<Person> friends,其List中的对象不是Person类型的对象,而是net.sf.ezmorph.bean.MorphDynaBean类型的对象。 说明,Json-lib对嵌套的自定义类支持的很差,或许是我写的方法有问题。
Jackson 26.427s
FastJson 40.556

3、总结:

Java Bean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib。这4中类库的序列化结构都正确。

Json字符串反序列化为Java Bean时,性能:Jackson > Gson > FastJson >Json-lib。并且Jackson、Gson、FastJson可以很好的支持复杂的嵌套结构定义的类,而Json-lib对于复制的反序列 化会出错。

Jackson、FastJson、Gson类库各有优点,各有自己的专长,都具有很高的可用性。

 

4、测试用例

1)Java Bean

复制代码
public class Person {
    private String name;
    private FullName fullName;
    private int age;
    private Date birthday;
    private List<String> hobbies;
    private Map<String, String> clothes;
    private List<Person> friends;

    //getter setter 方法。略

    @Override
    public String toString() {
        String str= "Person [name=" + name + ", fullName=" + fullName + ", age="
                + age + ", birthday=" + birthday + ", hobbies=" + hobbies
                + ", clothes=" + clothes +  "]\n";
        if(friends!=null){
            str+="Friends:\n";
            for (Person f : friends) {
                str+="\t"+f;
            }
        }
        return str;
    }

}

class FullName {
    private String firstName;
    private String middleName;
    private String lastName;
    
  //构造方法、getter setter 方法,略
   
    @Override
    public String toString() {
        return "[firstName=" + firstName + ", middleName="
                + middleName + ", lastName=" + lastName + "]";
    }

}
复制代码

 

2)Json-lib、Gson、Jackson、FastJson类库:

复制代码
import net.sf.json.JSONObject;

public class JsonObjectUtil {

    public static String bean2Json(Object obj){
        JSONObject jsonObject=JSONObject.fromObject(obj);
        return jsonObject.toString();
    }
    
    @SuppressWarnings("unchecked")
    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return (T)JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass);
    }

}

复制代码
复制代码
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class GsonUtil {
    private static Gson gson = new GsonBuilder().create();

    public static String bean2Json(Object obj){
        return gson.toJson(obj);
    }

    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return gson.fromJson(jsonStr, objClass);
    }
    
    public static String jsonFormatter(String uglyJsonStr){
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(uglyJsonStr);
        String prettyJsonString = gson.toJson(je);
        return prettyJsonString;
    }
}
复制代码
复制代码
import java.io.IOException;
import java.io.StringWriter;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonUtil {
    private static ObjectMapper mapper = new ObjectMapper();

    public static String bean2Json(Object obj) throws IOException {
        StringWriter sw = new StringWriter();
        JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
        mapper.writeValue(gen, obj);
        gen.close();
        return sw.toString();
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
            throws JsonParseException, JsonMappingException, IOException {
        return mapper.readValue(jsonStr, objClass);
    }
}
复制代码
复制代码
public class FastJsonUtil {
    public static String bean2Json(Object obj){
        return JSON.toJSONString(obj);
    }

    public static <T> T json2Bean(String jsonStr,Class<T> objClass){
        return JSON.parseObject(jsonStr, objClass);
    }
}
复制代码

 

3)Java对象序列化为Json字符串 测试类:

复制代码
public class TestBean2Json {
    private Person p;

    private Person createAPerson(String name,List<Person> friends) {
        Person newPerson=new Person();
        newPerson.setName(name);
        newPerson.setFullName(new FullName("xxx_first", "xxx_middle", "xxx_last"));
        newPerson.setAge(24);
        List<String> hobbies=new ArrayList<String>();
        hobbies.add("篮球");
        hobbies.add("游泳");
        hobbies.add("coding");
        newPerson.setHobbies(hobbies);
        Map<String,String> clothes=new HashMap<String, String>();
        clothes.put("coat", "Nike");
        clothes.put("trousers", "adidas");
        clothes.put("shoes", "安踏");
        newPerson.setClothes(clothes);
        newPerson.setFriends(friends);
        return newPerson;
    }

    @Before
    public void init(){
        List<Person> friends=new ArrayList<Person>();
        friends.add(createAPerson("小明",null));
        friends.add(createAPerson("Tony",null));
        friends.add(createAPerson("陈小二",null));
         p=createAPerson("邵同学",friends);
    }

//    @Test
    public void testGsonBean2Json(){
        System.out.println(GsonUtil.bean2Json(p));

        for (int i = 0; i < 1000000; i++) {
            GsonUtil.bean2Json(p);
        }
    }

    //@Test
    public void testJsonObjectBean2Json(){
        System.out.println(JsonlibUtil.bean2Json(p));

        for (int i = 0; i < 1000000; i++) {
            JsonlibUtil.bean2Json(p);
        }
    }

//    @Test
    public void testJacksonBean2Json() throws Exception{
        System.out.println(JacksonUtil.bean2Json(p));

        for (int i = 0; i < 1000000; i++) {
            JacksonUtil.bean2Json(p);
        }
    }

    @Test
    public void testFastJsonBean2Json() throws Exception{
        System.out.println(FastJsonUtil.bean2Json(p));

        for (int i = 0; i < 1000000; i++) {
            FastJsonUtil.bean2Json(p);
        }
    }

}
复制代码

 

 

4)Json字符串 反序列化为Java对象 测试类:

复制代码
public class TestJson2Bean {
    private String jsonStr;

    @Before
    public void init(){
         jsonStr="{\"name\":\"邵同学\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":[{\"name\":\"小明\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"Tony\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"陈小二\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null}]}";
    }

//    @Test
    public void testGsonjson2Bean() throws Exception{
        Person pp=GsonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);

        for (int i = 0; i < 1000000; i++) {
            GsonUtil.json2Bean(jsonStr, Person.class);
        }
    }

//    @Test
    public void testJsonlibJson2Bean() throws Exception{
        Person pp=JsonlibUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);

        for (int i = 0; i < 1000000; i++) {
            JsonlibUtil.json2Bean(jsonStr, Person.class);
        }
    }

//    @Test
    public void testJacksonJson2Bean() throws Exception{
        Person pp=JacksonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);

        for (int i = 0; i < 1000000; i++) {
            JacksonUtil.json2Bean(jsonStr, Person.class);
        }
    }

    @Test
    public void testFastJsonJson2Bean() throws Exception{
        Person pp=FastJsonUtil.json2Bean(jsonStr, Person.class);
        System.out.println(pp);

        for (int i = 0; i < 1000000; i++) {
            FastJsonUtil.json2Bean(jsonStr, Person.class);
        }
    }
}
复制代码

 

参考:http://www.json.org/json-zh.html

[转载]Android 4.0应用界面设计-Android开发资料下载-eoe Android开发者社区_Android开发论坛

mikel阅读(775)

[转载]Android 4.0应用界面设计-Android开发资料下载-eoe Android开发者社区_Android开发论坛.

与 iOS 相比,Android 系统界面存在各种不协调,应用界面本身缺乏统一的规范。虽然 Android 的开放性为应用的自主发挥带来了最大的可能性,但如果系统本身能够提供标准的范例,也未必是一件坏事,毕竟许多应用并不一定需要独创的界面。从 Android 4.0 开始,系统界面在一致性上有了许多改善,那么 Android 应用的界面应该如何设计?如果你仔细观察 Google 近期的一系列应用上的设计,应该能发现在一些指导性的要点,而这些设计也正在被第三方应用采用。

Android 应用不应该成为 iOS 应用的翻版,那么它应该是什么样子?androiduipatterns 网站针对 Android 应用的界面设计提出了一些规范性的建议,值得参考。

主界面

应用的主界面(起始界面)应该是什么样子?看下面这个规范图。

什么应用使用这样的起始界面呢?看这三个例子: Aldiko,Evernote 和 Google+。

分界面

进入应用的分界面之后如何设计,看下面这个范例。

上面一行是操作栏:最左边是应用图标(或许包括后退键),点击回到起始界面;中间部分主要考虑于应用协调的配色;最右边是当前情景下可进行的操作。

看下面的例子

列表界面

应用可能需要处理大量的数据,而列表则是将数据规则化呈现的一种方式。列表界面应该足够清晰,为用户提供一个好的概览,同时,列表界面的操作栏应该允许用户对列表进行单项或多项操作。

两个比较好的范例是 Aldiko 和 Google Mail。需要注意的是,列表的选择框通常是在左边,但是在 Aldiko 中,文件夹图标在左边非常突出,于是 Aldiko 选择框放在了右边,达到界面上的一种平衡。

载入列表

应用可能需要处理大量的信息,比如 Twitter 的时间线。对于用户来说,这意味着列表长度几乎是无尽的。目前,许多应用已经采用了比较通用的处理方法,当下滑到列表已缓冲条目下部的边界时,自动加载更多的信息。

下面是两个例子: Android Market 和 Twitter。

长按

对某个单项信息进行操作,一种交互方式是长按。这也许不是最明显的操作,但是节省屏幕空间,也很符合“情景菜单”的理念。

下面的三个例子:Aldiko,Astro 文件管理器和 Google+。

多选操作

对列表进行多选操作,最好在列表上的项目一侧增加选择栏,如下图:

当你选定了多个项目后,屏幕下方给出操作栏。

标签

从 Android 4.0 开始,系统进一步突出了分类标签。在顶部操作栏的下面,通常会有一个标签栏,你可以点击或者左右滑动,如下图

Android Market 和 Google+ 是两个例子

虽 然 Google 并没有在界面上给出太多限制,但是随着 Android 平台的发展,应用界面逐渐形成一套统一的规则和界面应该是一个趋势。这是否意味着一切应用必须遵循规范呢?那倒也未必。比如 Path 的界面,就未必符合任何平台的既成规范。如果你有开创性的界面,而且能够保证易用性,不妨去大胆创新,否则,遵循现有的良好规范可能会让你少走些许弯路。

[转载]Android 动画专题(1)---Tween Animation - 山岭巨人 - 博客园

mikel阅读(842)

[转载]Android 动画专题(1)—Tween Animation – 山岭巨人 – 博客园.

动画效果编程基础:

1.动画类型

Android中的动画由四种类型组成:

(1)XML

alpha 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果


(2)JavaCode

AlphaAnimation 渐变透明度动画效果
ScaleAnimation 渐变尺寸伸缩动画效果
TranslateAnimation 画面转换位置移动动画效果
RotateAnimation 画面转移旋转动画效果

2.动画效果的定义方法

Android动画效果,可以定义在xml文件,也可以定义在java代码中,实现效果是一样的。

(1)在xml中使用方法

① 打开Eclipse,新建Android工程
② res目录中新建anim文件夹
③ anim目录中新建一个myanim.xml(注意文件名小写)
④ 加入XML的动画代码(具体内容看后面)

<?xml version="1.0" encoding="utf-8"?>
  <alpha/>
  <scale/>
  <translate/>
  <rotate/>
</set>

(2)java代码中定义方法

//在代码中定义 动画实例对象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
    
 //根据各自的构造方法来初始化一个实例对象
myAnimation_Alpha= new AlphaAnimation(0.1f, 1.0f);
myAnimation_Scale = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Translate= new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Rotate= new RotateAnimation(0.0f, +350.0f,  Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

3.使用动画效果

(1)使用Xml中动画效果

public static Animation loadAnimation (Context context, int id)
//第一个参数Context为程序的上下文   
//第二个参数id为动画XML文件的引用
//例子:
myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件

(2)如果是代码中定义动画效果,就直接调用就行

使用从View父类继承过来的方法startAnimation()来为View或是子类View等等添加一个动画效果

public void startAnimation (Animation animation)

附录:

1.XML定义方法中各个参数属性:

Tween Animation共同的节点属性

表一

属性[类型] 功能
Duration[long] 属性为动画持续时间 时间以毫秒为单位
fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用

interpolator

指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int] 动画的重复次数
RepeatMode[int] 定义重复的行为 1:重新开始  2:plays backward
startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层

4种类型各自特有的节点元素:

<alpha>

表二

XML节点 功能说明
alpha 渐变透明度动画效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
toAlpha 属性为动画结束时透明度

<scale>

表三

scale 渐变尺寸伸缩动画效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸 0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置

<translate>

表四

translate 画面转换位置移动动画效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
为动画、结束起始时 X坐标上的位置
fromYDelta
toYDelta
为动画、结束起始时 Y坐标上的位置

<rotate>

表五

rotate 画面转移旋转动画效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY
为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置

2.Android SDK动画类 Animation

Tween Animation由4种类型:alpha、scale、translate、roate,在Android SDK中提供了相应的类,Animation类派生出了AlphaAnimation、ScaleAnimation、 TranslateAnimation、RotateAnimation分别实现了平移、旋转、改变 Alpha 值等动画,每个子类都在父类的基础上增加了各自独有的属性。

Animation

然后可以调用里面的函数设置相应的参数…

摘录自:http://www.eoeandroid.com/thread-653-1-1.html

http://www.moandroid.com/?p=790

编辑器加载中…

[转载]Android--Service之AIDL传递系统基本类型数据 - 承香墨影 - 博客园

mikel阅读(855)

[转载]Android–Service之AIDL传递系统基本类型数据 – 承香墨影 – 博客园.

Android–Service之AIDL传递系统基本类型数据

前言

前面讲解了Service的一些基本内容。但是对于绑定服务传递数据,只局限于本地服务,无法使用服务进行跨进程间的交互。如果需要用到跨进程 交互的话,需要用到一个新的技术-AIDL,这篇博客就针对AIDL如何传递内置类型数据进行讲解。对于Service不熟悉的朋友,可以先看看之前的博 客:Service基础Service高级Service应用

本篇博客内容如下:

  1. 什么是ADIL?
  2. 如何定义AIDL?
  3. ADIL做了什么?
  4. 使用ADIL传递系统基本数据

 

什么是AIDL?

先来回顾一下,Android在本地的Service中如何与其它组件进行交互的,首先Service必须实现其onBind()方法,然后在 onBind方法传递一个IBinder接口的实现,而在其它组件中使用bindService()绑定一个服务,再通过其中的参数 ServiceConnection对象获取到Service中定义的IBinder接口的实现。那么与Service进行数据交互,其实就是传递一个 IBinder,通过这个IBinder进行交互。

而现在就碰到一个问题,在同一个进程中,是可以获取到这个Service类的,也就可以获得这个Service中定义的IBinder,但是如 果在不同的应用中,即远程服务,如何获取IBinder呢?仅仅是在不同的应用定义一相同的类是没有用的,所以Android为我们提供了AIDL语言, 它需要先定义一个远程调用接口,然后为该接口提供一个实现类,通过共享这个远程调用接口来达到进程间数据交互的目的,而这个接口的代码是有很多共性的,并 且编写过程相当枯燥乏味,所以Android开发者为我们提供了ADIL来简化通讯接口的开发。

AIDL(Android Interface Definition Language)是Android远程调用接口的定义语言。它有它自己的一套语法规范,但是和Java类似,这并不难理解,详细的这个会后面介绍。而当 你定义好一个AIDL接口之后,你会发现在gen/目录下,多出一个与定义的AIDL包名相同,文件名相同的一个Java类,这个类是编译器根据定义的 AIDL接口自动生成的代码,观察之后发现其实它也是继承了Binder类(Binder是IBinder的实现类),所以它可以通过 ServiceConnection进行数据传递。Service只需要暴露这个AIDL接口给客户端,让客户端也定义它,这样两个应用进程就可以通讯 了。

 

如何定义AIDL?

AIDL的语法与Java接口的语法非常相似,但是存在一些差异:

  1. AIDL定义接口的源代码后缀必须以.aidl结尾。
  2. AIDL一样要指定AIDL接口的包信息package *。
  3. AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。
  4. AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。
  5. 如果需要传递其他类型的对象,需要import对象的包名,并需要对对象进行特殊处理(之后会介绍)。

例如:

1 package com.example.aidlservicedemo.domain;
2 
3 interface IDog{
4     String getName();
5     int getAge();    
6 }

 

ADIL做了什么?

当你声明完一个AIDL接口的时候,你会发现在项目的gen/目录下,对应包中存在一个同名的Java文件,这个文件是Android帮我们自 动生成的,里面有很多代码,这里只讲一下需要注意的。查看自动生成的这个Java文件代码,会发现它定义了一个名为Stub的静态抽象类,这个Stub继 承了Binder,实现了AIDL接口,当然其中也实现了AIDL接口的两个方法,粗略看一下会发现它对数据做了一个序列化和反序列化的操作。正因为 AIDL对数据进行了序列化和反序列化,所以才可以在进程间传递。

使用ADIL传递系统基本数据

定义好AIDL接口之后,就需要通过服务把接口暴露给客户端,这里Service.onBind()传递的就是这个Stub静态抽象类的实现类,其他没什么特别的。

下面通过一个Demo来演示ADIL如何传递数据的,在示例中,给出两个应用,分别实现Server与调用客户端,使用的AIDL接口就是上面给出的AIDL示例代码,这里不再重复定义。

AIDL服务:BaseTypeService.java

复制代码
 1 package com.example.aidlservicedemo;
 2 
 3 import java.util.Random;
 4 
 5 import com.example.aidlservicedemo.domain.IDog.Stub;
 6 
 7 import android.app.Service;
 8 import android.content.Intent;
 9 import android.os.IBinder;
10 import android.os.RemoteException;
11 import android.util.Log;
12 
13 public class BaseTypeService extends Service {
14     private final String TAG="main";
15     private DogBinder binder=null;
16     private String[] names=new String[]{"小白","旺财","小黑"};
17     private int[] ages=new int[]{1,2,3};
18     
19     /**
20      * Stub的实现类,Stub内部实现了Binder
21      * 内部实现AIDL定义的方法
22      */
23     public class DogBinder extends Stub{
24 
25         @Override
26         public String getName() throws RemoteException {
27             Random random=new Random();
28             int nextInt = random.nextInt(2);            
29             return names[nextInt];
30         }
31 
32         @Override
33         public int getAge() throws RemoteException {
34             Random random=new Random();
35             int nextInt = random.nextInt(2);            
36             return ages[nextInt];
37         }        
38     }
39     
40     @Override
41     public void onCreate() {
42         super.onCreate();
43         // 实例化Binder对象
44         binder=new DogBinder();
45         Log.i(TAG, "创建服务成功");
46     }
47 
48     @Override
49     public IBinder onBind(Intent intent) {
50         Log.i(TAG, "绑定服务成功");
51         // 返回Binder对象
52         return binder;
53     }
54 }
复制代码

客户端调用服务获取数据:

复制代码
  1 package com.example.aidlClientdemo;
  2 
  3 import com.example.aidlservicedemo.domain.IDog;
  4 import android.app.Activity;
  5 import android.content.ComponentName;
  6 import android.content.Intent;
  7 import android.content.ServiceConnection;
  8 import android.os.Bundle;
  9 import android.os.IBinder;
 10 import android.view.View;
 11 import android.view.View.OnClickListener;
 12 import android.widget.Button;
 13 import android.widget.Toast;
 14 
 15 public class BaseTypeActivity extends Activity {
 16     private Button btn_startService, btn_endService,btn_getServiceData;
 17     private IDog dogService;
 18     
 19     @Override
 20     protected void onCreate(Bundle savedInstanceState) {
 21         super.onCreate(savedInstanceState);
 22         setContentView(R.layout.activity_service);
 23 
 24         btn_startService = (Button) findViewById(R.id.btn_startService);
 25         btn_endService = (Button) findViewById(R.id.btn_endService);
 26         btn_getServiceData = (Button) findViewById(R.id.btn_getServiceData);
 27 
 28         btn_startService.setOnClickListener(click);
 29         btn_endService.setOnClickListener(click);
 30         btn_getServiceData.setOnClickListener(click);
 31     }
 32 
 33     private View.OnClickListener click = new OnClickListener() {
 34 
 35         @Override
 36         public void onClick(View v) {
 37             switch (v.getId()) {
 38             case R.id.btn_startService:
 39                 startService();
 40                 break;
 41             case R.id.btn_endService:
 42                 endService();
 43                 break;
 44             case R.id.btn_getServiceData:
 45                 getServiceDate();
 46                 break;
 47             }
 48         }                
 49     };
 50     /*
 51      * 获取数据
 52      */
 53     private void getServiceDate() {
 54         try {
 55             if(dogService!=null){
 56                 StringBuilder sBuilder=new StringBuilder();
 57                 sBuilder.append("name:"+dogService.getName());
 58                 sBuilder.append("\nage:"+dogService.getAge());
 59                 Toast.makeText(BaseTypeActivity.this, sBuilder.toString(), Toast.LENGTH_SHORT).show();
 60             }
 61             else
 62             {
 63                 Toast.makeText(BaseTypeActivity.this, "请先绑定服务", Toast.LENGTH_SHORT).show();
 64             }
 65         } catch (Exception e) {
 66             e.printStackTrace();
 67         }        
 68     }
 69 
 70     private ServiceConnection connBase=new ServiceConnection() {
 71         
 72         @Override
 73         public void onServiceDisconnected(ComponentName name) {
 74             dogService=null;
 75         }
 76         
 77         @Override
 78         public void onServiceConnected(ComponentName name, IBinder service) {
 79             // IDog.Stub.asInterface,获取AIDL接口实现对象
 80             dogService=IDog.Stub.asInterface(service);
 81         }
 82     };
 83     
 84     /**
 85      * 开始服务
 86      */
 87     private void startService(){
 88         Intent intent=new Intent();
 89         intent.setAction("cn.bgxt.Service.BASE_TYPE_SERVICE");
 90         bindService(intent, connBase, BIND_AUTO_CREATE);
 91         Toast.makeText(BaseTypeActivity.this, "开始绑定服务", Toast.LENGTH_SHORT).show();
 92     }
 93     /**
 94      * 停止服务
 95      */
 96     private void endService(){
 97         if(connBase!=null)
 98         {
 99             unbindService(connBase);
100             Toast.makeText(BaseTypeActivity.this, "服务解除绑定", Toast.LENGTH_SHORT).show();
101         }
102     }    
103 }
复制代码

效果展示:先运行服务应用,再运行客户端应用。

 

源码下载

 

总结

本篇博客只介绍了AIDL的基本结构,以及如何通过AIDL接口传递一个系统内置类型的数据。下一篇博客将介绍一下AIDL的高级应用,如何传递一个自定义对象。

[转载]android 播放局域网共享多媒体文件 - qq1761310972 - 博客频道 - CSDN.NET

mikel阅读(743)

[转载]android 播放局域网共享多媒体文件 – qq1761310972 – 博客频道 – CSDN.NET.

1.Android 不支持直接访问局域网的共享文件,所以要用到其它的开源库,来实现文件的访问。

http://jcifs.samba.org/   jcifs 实现smb协议,关于smb协议,可以参考百度。
https://clinkc.svn.sourceforge.net/svnroot/cgupnpjava/trunk/   实现http服务器
http://commons.apache.org/proper/commons-net/ (或者用apache来实现http服务器 )

2. jcifs访问到文件后,播放器不能直接播放smb协议的文件,所以中间加了一个转换,将smb协议
获取到得文件流转发给http服务器,然后播放器可以直接播放。在线的简单视频播放主要在于http
206协议的处理,可以做到边下边播。如文件的断点续传、多线程下载等,就是进行了分段的请求,
常用的搜索http响应一般返回200,表示响应完成。206则表示部分响应成功,详细的可以参考http
协议。

3.demo中实现了对于局域网中共享的多媒体文件播放,如果更改了数据源,则可以在浏览器中直接

播放SD卡中的多媒体文件,主要在于数据流的转换。想要过河,就得造桥。

 

demo下载:http://download.csdn.net/detail/qq1761310972/5207500

[转载]java 利用SMB读取远程文件 - 青龙 - ITeye技术网站

mikel阅读(1084)

[转载]java 利用SMB读取远程文件 – 青龙 – ITeye技术网站.

package com.yss.test.FileReadWriter;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;

import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;

public class RemoteAccessData {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
smbGet1("smb://192.168.75.204/test/新建 文本文档.txt");
smbGet("smb://192.168.75.204/test/新建 文本文档.txt","e:/");
}

/**
* 方法一:
*
* @param remoteUrl
* 远程路径 smb://192.168.75.204/test/新建 文本文档.txt
* @throws IOException
*/
public static void smbGet1(String remoteUrl) throws IOException {
SmbFile smbFile = new SmbFile(remoteUrl);
int length = smbFile.getContentLength();// 得到文件的大小
byte buffer[] = new byte[length];
SmbFileInputStream in = new SmbFileInputStream(smbFile);
// 建立smb文件输入流
while ((in.read(buffer)) != -1) {

System.out.write(buffer);
System.out.println(buffer.length);
}
in.close();
}

// 从共享目录下载文件
/**
* 方法二:
* 路径格式:smb://192.168.75.204/test/新建 文本文档.txt
* smb://username:password@192.168.0.77/test
* @param remoteUrl
* 远程路径
* @param localDir
* 要写入的本地路径
*/
public static void smbGet(String remoteUrl, String localDir) {
InputStream in = null;
OutputStream out = null;
try {
SmbFile remoteFile = new SmbFile(remoteUrl);
if (remoteFile == null) {
System.out.println("共享文件不存在");
return;
}
String fileName = remoteFile.getName();
File localFile = new File(localDir + File.separator + fileName);
in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
out = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// 向共享目录上传文件
public static void smbPut(String remoteUrl, String localFilePath) {
InputStream in = null;
OutputStream out = null;
try {
File localFile = new File(localFilePath);

String fileName = localFile.getName();
SmbFile remoteFile = new SmbFile(remoteUrl + "/" + fileName);
in = new BufferedInputStream(new FileInputStream(localFile));
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
buffer = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// 远程url smb://192.168.0.77/test
// 如果需要用户名密码就这样:
// smb://username:password@192.168.0.77/test

}

所需jcifs jar包:

jcifs-1.3.14.jar (385.7 KB)

[转载]GPS定位,经纬度附近地点查询–C#实现方法 - 小小新新 - 博客园

mikel阅读(1057)

[转载]GPS定位,经纬度附近地点查询–C#实现方法 – 小小新新 – 博客园.

 目前的工作是需要手机查找附近N米以内的商户,功能如下图

数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545),

最初想法  以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)

上网百度类似的文章有了点眉目

大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减

终于找到想要的文章

http://digdeeply.org/archives/06152067.html

PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍

参考原文章 lz改成了C#

废话不多少直接上代码:

/// <summary>
    /// 经纬度坐标
    /// </summary>    

  public class Degree
    {
        public Degree(double x, double y)
        {
            X = x;
            Y = y;
        }
        private double x;

        public double X
        {
            get { return x; }
            set { x = value; }
        }
        private double y;

        public double Y
        {
            get { return y; }
            set { y = value; }
        }
    }


    public class CoordDispose
    {
        private const double EARTH_RADIUS = 6378137.0;//地球半径(米)

        /// <summary>
        /// 角度数转换为弧度公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double radians(double d)
        {
            return d * Math.PI / 180.0;
        }

        /// <summary>
        /// 弧度转换为角度数公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double degrees(double d)
        {
            return d * (180 / Math.PI);
        }

        /// <summary>
        /// 计算两个经纬度之间的直接距离
        /// </summary>

        public static double GetDistance(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLat2 = radians(Degree2.X);
            double a = radLat1 - radLat2;
            double b = radians(Degree1.Y) - radians(Degree2.Y);

            double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
             Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
            s = s * EARTH_RADIUS;
            s = Math.Round(s * 10000) / 10000;
            return s;
        }

        /// <summary>
        /// 计算两个经纬度之间的直接距离(google 算法)
        /// </summary>
        public static double GetDistanceGoogle(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLng1 = radians(Degree1.Y);
            double radLat2 = radians(Degree2.X);
            double radLng2 = radians(Degree2.Y);

            double s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) * Math.Sin(radLat2));
            s = s * EARTH_RADIUS;
            s = Math.Round(s * 10000) / 10000;
            return s;
        }

        /// <summary>
        /// 以一个经纬度为中心计算出四个顶点
        /// </summary>
        /// <param name="distance">半径(米)</param>
        /// <returns></returns>
        public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance)
        {
            double dlng = 2 * Math.Asin(Math.Sin(distance / (2 * EARTH_RADIUS)) / Math.Cos(Degree1.X));
            dlng = degrees(dlng);//一定转换成角度数  原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了

            double dlat = distance / EARTH_RADIUS;
            dlat = degrees(dlat);//一定转换成角度数

            return new Degree[] { new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-bottom
                                  new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y + dlng,6)),//right-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y + dlng,6)) //right-bottom
            };

        }
    }

测试方法:

static void Main(string[] args)
        {
            double a = CoordDispose.GetDistance(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));//116.416984,39.944959
            double b = CoordDispose.GetDistanceGoogle(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));
            Degree[] dd = CoordDispose.GetDegreeCoordinates(new Degree(116.412007, 39.947545), 102);
            Console.WriteLine(a+" "+b);
            Console.WriteLine(dd[0].X + "," + dd[0].Y );
            Console.WriteLine(dd[3].X + "," + dd[3].Y);
            Console.ReadLine();
        }

lz试了很多次 误差在1米左右

拿到圆的顶点就好办了

数据库要是SQL 2008的可以直接进行空间索引经纬度字段,这样应该性能更好(没有试过)

lz公司数据库还老 2005的 这也没关系,关键是经纬度拆分计算,这个就不用说了 网上多的是 最后上个实现的SQL语句

SELECT id,zuobiao FROM dbo.zuobiao WHERE zuobiao<>'' AND 
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)>116.41021 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)<116.413804 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)<39.949369 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)>39.945721

[转载]项目开发:LigerUI+ASP.NET MVC的应用(一) - wangyong969 - 博客园

mikel阅读(1433)

[转载]【项目开发】LigerUI+MVC的应用(一) – wangyong969 – 博客园.

近期因为稍微空闲有点时间,就晚上回家自己在随便写写代码,也就边写边记,中间主要采用了微软的MVC4.0框架。虽然目前公司也是使用的MVC的模式, 但是因为是重新封装了,所以对微软的MVC框架其实不是很熟悉,毕竟很多核心思想是相同。UI展示主要使用的是LigerUI。在刚开始选择UI框架的时 候的,也挺纠结的。但最终UI层还是选择了LigerUI,选择LigerUI的理由也很简单,第1是因为开源,第2因为是中文的,最主要的原因还是因 为,我想写的是一个后台程序,所以这个相对比较适合一些。当然其中不好的就是资料相对少了一些。

 

  • 使用的环境:

工具:     VS2010 ,  SQLServer2008 R2

开发语言:     C# ,  .Net framework 4.0,MVC4.0框架

前台UI:  JQuery ,LigerUI  ,  JQuery.validate.js. (等)

 

一、首先肯定是需要安装MVC4.0框架,如果没有,自行去下载,其中具体怎么安装就不说了,安装完成之后,点击“文件” >> “新建” >>  “项目”

 

 

二、第1步完成之后,将会弹出下图,经色框圈中的地方,非常重要。图示下面的名称,可以随便命名

三、当选择“ASP.NET MVC 4 Web应用程序”之后,会弹出以下MVC中预置的项目模板。

注意:MVC 2是没有这个模板选择的

 

图中1:主要是选择模板,模板选择的不一样,创建出来的文件也不一样

图中2:主要选择“视图引擎”,默认这里可以选择ASPX, Razor。 至于这个视图引擎经过我的测试发现,如果选择“空”模板的时候,此处选择是无所谓的;如果选择的是其他的,比如“Internet应用程序”,那么在生成 出来的文件,后辍将不一样。Razor以.cshtml结束。Aspx以.aspx结尾。

图中3:单元测试。我想很多人都知道。我这里就没有建单元测试了

 

四、在这里我选了“空”的模板,原因主要有几个:1)、空模板的文件数量及大小相对较小,新建“空”的模板大概是十多M,而如果选择的是 “Internet应用程序”,至少应该在30M以上。有些dll,可能是我后面根本不会用到的。比如EntityFramework。2)、通过建立 “空”的模板,来比对其他的模板,多出了什么东西,然后对不了解进行学习。

项目建完之后,工程目录如下图:

图中所标标示的颜色不一样的地方,对后面的开发都是很重要的

五、 接下来,我们先在View目录下面新建一个Home的文件夹,然后将进行添加视图

 

通过上图的点击,则会弹出一个视图添加的窗口,如下图:

这里我们默认全部都不勾,然后在视图名称填上“Index”,视图引擎里面选择cshtml。点击“确定”, 那么此时的View中的文件已经建好了。在Vs的编辑窗口,建会弹出一个界面。我们Div中录入“hello,Word”。

六、视图建立完成之后,需要在Controllers中建一个HomeController.cs的文件。如下图:

 

这里的创建文件同第五步一样,唯一区别就是在添加的时候选择“控制器”就OK了。

 

最后,我们再按F5运行,一个hello,Word就会映入我们的眼帘。到此为止,我们的MVC的工程已经创建好了。当然这其中创建的视图与控制器过程都是很重要的。后面再来继续介绍。

[转载]Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别 - 高杰才_Android - 博客园

mikel阅读(808)

[转载]Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别 – 高杰才_Android – 博客园.

如果java提供的系统异常类型不能满足程序设计的需求,那么可以设计自己的异常类型。

从java异常类的结构层次可以看出,java类型的公共父类为Throwable.在程序运行中可能出现俩种问题:一种是由硬件系统或JVM导致 的故障,java定义该故障为Error,这类问题是用户程序不能够处理的;另外一种问题是程序运行错误,java定义为Exception,这种情况 下,可以通过程序设计调整来实现异常处理。

因此,用户定义的异常类型必须是Throwable的直接或间接子类。我推荐大家的异常类型以Exception为直接父类。下面开始我们的自定义异常类之旅…

 

1、首先定义自己的异常类AgeOutOfBound

/**
* 自定义异常类
* */
public class AgeOutOfBound extends Exception {

public AgeOutOfBound() {
System.out.print("Sorry,age out of bound !");
}
}

2、定义一个类,根据参数值判断是否抛出异常

/**
* 定义一个方法,根据参数值决定是否抛出异常
* */
public class AgeInput {
public static void checkAage(int age)throws AgeOutOfBound{ //用关键字throws指明调用此方法可能抛出的异常
if(age&gt;0 &amp;&amp; age&lt;200){
System.out.print("right!");
}else{
System.out.println("---------------");
throw new AgeOutOfBound(); //抛出异常用关键字throw
}
}
}

3、

/**
* 测试类,如果有异常场则捕获
* */
public class Demo {

public static void main(String[] args) {
int age = 100;
try {
AgeInput.checkAage(age);
} catch (AgeOutOfBound e) {
System.out.println("Are you rellly :" + age + " years old?");
}
}

}

运行结果:当age=100,输入right

当age = 300,输出

—————
Sorry,age out of bound !Are you rellly :300 years old?

如有哪里不懂,可以到这里下载项目代码

http://download.csdn.net/detail/gaojiecaiandroid/6525621

补充:

下面说说throw和throws的区别

throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。如下面例子所示:
public class Shoot { 创建类
static void pop() throws NegativeArraySizeException {
//定义方法并抛出NegativeArraySizeException异常
int [] arr = new int[-3];//创建数组
}
public static void main(String[] args) {//主方法
try {
pop(); //调用pop()方法
} catch (NegativeArraySizeException e) {
System.out.println("pop()方法抛出的异常");//输出异常信息
}
}
}
2、throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。举例如下:
class MyException extends Exception { //创建自定义异常类
 String message; //定义String类型变量
 public MyException(String ErrorMessagr) {  //父类方法
       message = ErrorMessagr;
 }
 public String getMessage(){   //覆盖getMessage()方法
  return message;
 }
}
public class Captor { //创建类
static int quotient(int x,int y) throws MyException{//定义方法抛出异常
if(y < 0){  //判断参数是否小于0
         throw new MyException("除数不能是负数");//异常信息
 }
 return x/y;//返回值
 }
public static void main(String args[]){ //主方法
 try{ //try语句包含可能发生异常的语句
                int result = quotient(3,-1);//调用方法quotient()
    }catch (MyException e) { //处理自定义异常
  System.out.println(e.getMessage()); //输出异常信息
  }
    catch (ArithmeticException e) {
                   //处理ArithmeticException异常
  System.out.println("除数不能为0");//输出提示信息
  }
   catch (Exception e) { //处理其他异常
  System.out.println("程序发生了其他的异常");
                  //输出提示信息
  }
 }
}

[转载]android中正确导入第三方jar包 - Jaryleely - 博客园

mikel阅读(881)

[转载]android中正确导入第三方jar包 – Jaryleely – 博客园.

andriod中如果引入jar包的方式不对就会出现一些奇怪的错误。

工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug。

刚开始是这样引用的(eclipse):

右键工程,Build path,java build path,

选择libraries,在右边的按钮中点击“Add External JARs”,

然后选择合适的jar包(大部分人应该会这样做).

结果控制台立刻报错:conversion to dalvik format failed with error 1。

而且项目上还会出现红叉,虽然项目里并没有错误。

clean一下,项目正常,但是bin里的apk文件和dex文件都没了,运行项目出现错误:Can not find **.apk后来找到原因是因为导入jar包的方式不对,

正确的方法如下:  

1,右键工程,     Build path,    java build path,

2,选择libraries在右边的按钮中点击“Add Library”

3,选择“User library”,点击“下一步”

4,点击“User librarys”按钮在出现的界面中点击“New..”按钮

在弹出的界面中随便起一个名字,点击“确定”

5,点击“Add jars”按钮选择第三方jar包,

点击“确定”完成操作。这样的话该jar包会被一起打包到apk中,问题也就解决了!