当前位置:  编程技术>移动开发
本页文章导读:
    ▪pushlet事例-hello worl        pushlet例子-hello worl pushlet是comet的一个实现框架,在Servlet机制下,数据从server端的java对象直接推送(push)到html页面,无需插件的支持。至于comet和ajax的区别什么的,大家上网看一下即可,.........
    ▪ 依据两个经纬度计算两地距离        根据两个经纬度计算两地距离 com.baidu.mapapi.utils.DistanceUtil哎http://www.verydemo.com/demo_c161_i59188.htmlhttp://ypf3027.iteye.com/blog/427055http://www.blogjava.net/sinoly/archive/2007/01/22/95406.html package a; public class Distan.........
    ▪ Objective-C语法以内存管理       Objective-C语法之内存管理 1、Objective-C内存管理简介:     Objective-C需要自己考虑内存的管理,对于从Java, C#等语言转向Objective-C平台的程序员新手来说,这是个很大的挑战。幸运的是,如果.........

[1]pushlet事例-hello worl
    来源: 互联网  发布时间: 2014-02-18
pushlet例子-hello worl

pushlet是comet的一个实现框架,在Servlet机制下,数据从server端的java对象直接推送(push)到html页面,无需插件的支持。至于comet和ajax的区别什么的,大家上网看一下即可,这里不做太多说明。

首先去下载pushlet,下载地址:http://www.pushlets.com/,我下载的是一个当下最新的版本2.0.4。下面以一个例子做下说明,详细的可以看一下pushlet自身带的例子,源码也不是很复杂,包括几个js文件。有空大家看看源码可能更好些。

首先建立一个web工程projPushlet,将pushlet.jar放到lib目录中,引入到工程。并且将pushlet.properties和sources.properties两个文件拷贝到WEB-INF目录中去。工程的目录结构如图示



 
我们一般只需要对sources.properties进行修改即可。创建的消息源必须在这个文件中进行配置。消息源需要实现EventSource接口

先看一下web.xml文件的servlet配置

1   <?xml version="1.0" encoding="UTF-8"?> 

2   <web-app version="2.5"  

3       xmlns="http://java.sun.com/xml/ns/javaee"  

4       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

5       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  

6       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

7     <servlet> 

8           <servlet-name>pushlet</servlet-name> 

9           <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class> 

10          <load-on-startup>1</load-on-startup> 

11      </servlet> 

12   

13      <!-- Define the Servlet Mappings. --> 

14   

15      <!-- The pushlet --> 

16      <servlet-mapping> 

17          <servlet-name>pushlet</servlet-name> 

18          <url-pattern>/pushlet.srv</url-pattern> 

19      </servlet-mapping>  

20  </web-app> 

 注意,缺省不需要修改<url-pattern>/pushlet.srv</url-pattern>,如果修改,需要在对应的js文件中也要修改。pushlt缺省就是通过pushlet.srv触发servlet的。

==========================================

 

看一下index.jsp这个文件的内容

1    <%@ pagecontentType="text/html;charset=UTF-8" language="java" %> 

2    <html> 

3    <head> 

4        <script type="text/javascript" src="/blog_article/ajax-pushlet-client.js"></script> 

5        <script type="text/javascript"> 

6            PL._init(); 

7            PL.joinListen('/zhaoyang/hi'); 

8            function onData(event) { 

9                alert(event.get("hw")); 

10           } 

11       </script> 

12   </head> 

13    

14   <body> 

15   <h1>my first pushlet</h1> 

16   </body> 

17   </html> 

其中,第6行,是对pushlet的初始化,触发web.xml中的servlet。其中,第七行特别重要,这里的监听的主题,必须在sources.properties中配置的对象中声明这个主题。sources.properties配置着事件源(EventSources),在服务器启动时会自动激活。可以通过服务器的启动记录查看的到。可以将这个文件放到WEB-INF目录下面或者classess目录下面都可以。(详细可以看sources.properties内的注释)

然后看一下sources.properties这个文件内容。如下图示:


 ‍
注意,source1是系统缺省自带的,source2是我自己配置的,并且在index.jsp中的脚本中,配置的/zhaoyang/hi是和这儿是对应的。具体是这样的。HwPlushlet是com.css.HelloWorldPlushlet对象的一个内部类,并且继承EventPullSource接口。大家看一下HelloWorldPlushlet.java就全明白了。代码如下:

 

1   package com.css; 
2     

3   import nl.justobjects.pushlet.core.Event;
4    import nl.justobjects.pushlet.core.EventPullSource; 
5     
6    import java.io.Serializable; 
7     
8    /** 
9     *Created by IntelliJ IDEA. 
10    * User:liuzhy 
11    * Date: 2011-1-18
12    * Time:10:54:35 
13    */
14   publicclass HelloWorldPlushlet implements Serializable{ 
15       static public class HwPlushlet extends EventPullSource { 
16    
17           @Override 
18           protected long getSleepTime() { 
19               return 1000;   
20           } 
21    
22           @Override 
23           protected Event pullEvent() { 
24               Event event =Event.createDataEvent("/zhaoyang/hi"); 
25               event.setField("hw","hello,world"); 
26               return event;  
27           } 
28       } 
29   } 
30   

在上面的代码中,可以看到创建事件(createDataEvent)的主题(aSubject)是/zhaoyang/hi,和index.jsp中PL.joinListen('/zhaoyang/hi'); 是对应的。EventPullSource有两个方法,一个是设置休眠时间(getSleepTime),另一个是创建事件(pullEvent)。其中,业务部分就写在pullEvent()方法中即可,这个方法会被定时调用。

这样这个基本的例子就OK了,运行一下,看看吧。

 

 访问http://localhost:8080/ 会定时弹出alert窗口,窗口的内容就是 event.setField("hw","hello,world");,呵呵。如图:



 ‍

如果这个页面关闭了,服务器会自动取消订阅,和移除对应的session信息。下面是我关闭页面后,服务器端的输出信息,如图:



 ‍
-----------------------------------------------

这里,因为我没有对pushlet的原理进行说明,主要是写了一个例子,如果要了解原理,可以上网Google一下,原理方面的资料很多,但是实际的例子确很少,呵呵。

来自:http://hi.baidu.com/hivemind/item/a0a08bd2cb7df9b832db9064


    
[2] 依据两个经纬度计算两地距离
    来源: 互联网  发布时间: 2014-02-18
根据两个经纬度计算两地距离
com.baidu.mapapi.utils.DistanceUtil



http://www.verydemo.com/demo_c161_i59188.html

http://ypf3027.iteye.com/blog/427055
http://www.blogjava.net/sinoly/archive/2007/01/22/95406.html

package a;

public class Distance {

	private static final double EARTH_RADIUS = 6378137.0;

	public static void main(String[] args) {
		double lo1 = 108.90, la1 = 34.1;// 第一个经纬度
		double lo2 = 115.4648060, la2 = 38.8738910;// 第二个经纬度
		System.out.println("经纬度结果:" + getDistance(lo1, la1, lo2, la2));
		System.out.println("经纬度结果:" + getDistance(0, 0, 0, 0));

	}

	// 返回单位是米
	public static double getDistance(double longitude1, double latitude1,
			double longitude2, double latitude2) {

		double Lat1 = rad(latitude1);
		double Lat2 = rad(latitude2);
		double a = Lat1 - Lat2;
		double b = rad(longitude1) - rad(longitude2);
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
				+ Math.cos(Lat1) * Math.cos(Lat2)
				* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000;
		return s;
	}

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

}

    
[3] Objective-C语法以内存管理
    来源: 互联网  发布时间: 2014-02-18
Objective-C语法之内存管理
1、Objective-C内存管理简介:

    Objective-C需要自己考虑内存的管理,对于从Java, C#等语言转向Objective-C平台的程序员新手来说,这是个很大的挑战。幸运的是,如果熟悉了Objective-C的内存管理机制,手工管理内存也没有那么可怕。 Objective-C的内存管理介于C/C++和Java C#直接,不像C/C++语言内存管理全部需要程序员一手包办,也不像Java C#语言有那么完备的内存垃圾回收器。(Objective-C 2.0有GC机制,不过不支持IOS)。那他是怎么管理内存的呢?通过引用计数进行管理的。PS:在iOS 5后增加了Automatic Reference Counting(ARC 自动引用计数)特性,这样程序员不需要自己操心管理内存了,ARC和GC不一样,ARC是编译器的行为。ARC后面再讲。不过熟悉Objective-C的内存管理机制是非常必要的。

2、内存管理原理:

   Objective-C内存管理模型是基于对象的所有权。如果你拥有这个对象,那么你就有责任去释放它。一个对象可以有多个拥有者。如果这个对象的拥有和为0时,系统将自动释放这个对象。对象的所有权和释放有四个原则:

 

  • 任何你创建的对象你都获得其所有权。(包括 alloc ,new ,copy等关键字获得的对象)
  • 通过retain获得对象的所有权
  • 如果你不需要一个对象了,你必须释放所有权
  • 你不能释放你没有所有权的对象
引用计数(retainCount)是Objective-C对象引用的唯一依据。调用实例管理的release方法后,此属性减1,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永不该手动调用对象的dealloc方法。
图片来自苹果官网。
3、示例:环境是在不选择ARC的环境下
新建Person类,使他继承与NSObject,在.m文件中实现dealloc方法:
[cpp] view plaincopy
  • - (void) dealloc    
  • {    
  •     NSLog (@"dealloc called. Bye Bye.");    
  •     [super dealloc];    
  •       
  • }   
  • 在引用计数为0时,这个方法就会被调用,证明这个对象被销毁。
     
    创建一个对象,打印它的引用计数
    [cpp] view plaincopy
  • Person *person = [[Person alloc] init];  
  •   
  • NSLog(@"对象person的retainCount: %d", [person retainCount]);  
  • 对象person的retainCount: 1

    我们增加1

     

    [cpp] view plaincopy
  • Person *person = [[Person alloc] init];  
  •  NSLog(@"对象person的retainCount: %d",[person retainCount] );  
  •  [person retain];  
  •  NSLog(@"对象person的retainCount: %d", [person retainCount]);  
  •  

    打印结果:

    对象person的retainCount: 1

    对象person的retainCount: 2

    和传说的一样,retainCount增加了。可以有在release时,减少到1时就不再减 了

     

    [cpp] view plaincopy
  • Person *person = [[Person alloc] init];  
  • NSLog(@"对象person的retainCount: %d",[person retainCount] );  
  • [person retain];  
  • NSLog(@"对象person的retainCount: %d", [person retainCount]);  
  • [person release];  
  • [person release];  
  • NSLog(@"对象person的retainCount: %d", [person retainCount]);  
  • 这个代码最后打印出来的retainCount是0吗?打印结果:

    [cpp] view plaincopy
  • 2012-07-05 16:05:29.830 ObjectiveCTest[2847:f803] 对象person的retainCount: 1  
  • 2012-07-05 16:05:29.831 ObjectiveCTest[2847:f803] 对象person的retainCount: 2  
  • 2012-07-05 16:05:29.831 ObjectiveCTest[2847:f803] dealloc called. Bye Bye.  
  • 2012-07-05 16:05:29.832 ObjectiveCTest[2847:f803] 对象person的retainCount: 1  
  • 震惊了,第一次release 时retainCount减1了,再release , d对象的dealloc called了,但是retainCount 还是1.在stackoverflow.com的查了一下,有人说这个retainCount没什么用。。。。可以事实的确如retainCount是1,对象被干掉了。有人说,要把person = nil。这样retainCount就是0了。试了下,nil的 retainlCount永远是0.这个赋值没有意义。

    4、NSAutoreleasePool自动释放内存

    如果仅仅是创建,释放,这样对应,就很好理解。但是大多数人不理解的是自动释放内存这个地方,感觉琢磨不透,但其实原理也很简单。
    C/C++编程时有个很重要的对内存管理的原则:谁创建谁销毁。但是这个原则在有些情况下却无法遵守:比如让一个普通函数返回一块内存区域。函数调用者必须在函数调用完毕后自己负责销毁这块内存,而在Objective-C的自动内存释放的机制下,就不用那么烦恼了。

    先看看最经典的程序入口程序,也用到自动释放。

    [cpp] view plaincopy
  • NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  • int retVal = UIApplicationMain(argc, argv, nil, nil);  
  • [pool release];  
  • 我们先把pool看成一个普通对象,先是alloc,pool的retainCount为1。
    第三句release,retainCount为0,自动调用它的dealloc方法。它和任何其它普通对象没 任何区别。
    神奇的地方在哪里?
    NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。NSAutoreleasePool自身在销毁的时候,会遍历一遍这个数组,release数组中的每个成员。如果此时数组中成员的retain count为1,那么release之后,retain count为0,

     

     

    [cpp] view plaincopy
  • NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  • Person *person = [[Person alloc] init];  
  • NSLog(@"对象person的retainCount: %d",[person retainCount] );  
  • [person autorelease];  
  • NSLog(@"到这里,person还没被释放");  
  • [pool release];  
  •  

    打印结果:

     

    [cpp] view plaincopy
  • 2012-07-05 16:34:38.823 ObjectiveCTest[3045:f803] 对象person的retainCount: 1  
  • 2012-07-05 16:34:38.823 ObjectiveCTest[3045:f803] 到这里,person还没被释放  
  • 2012-07-05 16:34:38.824 ObjectiveCTest[3045:f803] dealloc called. Bye Bye.  
  • 在调用pool release的时候,person才被释放。这就是自动释放的神奇的地方,这样就可以创建对象

    著作权声明:本文由http://blog.csdn.net/totogo2010/原创


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3