微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > J2ME中多线程网络连接编程的分析

J2ME中多线程网络连接编程的分析

时间:05-04 来源:互联网 点击:

介绍并分析了J2ME的通用网络连接框架(GCF),并以此为基础,指出了在J2ME网络连接编程中存在的问题,并提出了通过构建多线程的两种解决方法。

关键词J2MEGCF多线程网络连接

引言

J2ME(Java2MicroEdition)是Java2的一个组成部分,它与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话、可视电话、数字机顶盒和汽车导航系统等等。即J2ME是为消费电子产品和手持设备量身定制的Java专用版本。

J2ME的出现使开发跨平台的消费类电子产品的应用软件成为可能。Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。它提供了基于HTTP的高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,从而使得不同的Client访问不同的资源。

在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME网络编程就变得尤为重要。那么为了高效地进行网络编程,就要利用Java语言的多线程编程机制。

1、J2ME的网络连接框架(GCF)

通用连接框架(GenericConnectionFramework,GCF)为资源有限的设备提供了一个可扩展的、通用的I/O框架。GCF是一组在javax.microedition.io包中定义的接口。图1显示了GCF的类层次结构。

图1GCF的类层次结构

在GCF中共定义了七个接口,其中Connection是最基本的连接类型。且同时提供了对数据包和流连接的支持。沿着层次结构向下派生出提供更多功能的接口。例如,StreamConnection接口支持输入流和输出流,ContentConnection接口又扩展了StreamConnection接口以支持对流的内容类型、数据长度和编码格式的确定,HttpConnection接口又扩展了ContentConnection接口以支持对于标准的HTTP请求。如在框架层规定的适用于手机或双向寻呼机的移动信息设备框架MIDP(MobileInformationDeviceProfile)在其MIDP1.0规范只要求设备支持HTTP连接协议,而更新的MIDP2.0规范要求同时支持HTTP和HTTPS,后者提供了对更安全的网络连接的支持。

2、网络编程中的多线程

由于目标设备具有内存小,计算能力弱和电池供电等特点,所以如何使应用程序高效的运行就成为开发中的一个大问题.尤其针对手机等移动信息设备时,无线通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中引入多线程就显得十分重要。

当程序运行的时候,ApplicationManagementSoftware(应用管理软件)首先初始化一个MIDlet,然后调用它的startApp()方法使得MIDlet进入active状态,这条程序分支就是主线程,它执行其他的方法后都会返回到这个分支上来继续执行。然而网络连接是个可能堵塞的操作,意味着它可能长时间都不返回。

在SUN公司的无线开发包WTK中模拟一段网络连接程序运行时,WTK会提示网络连接工作可能会堵塞用户输入,需要创建另外一个线程去进行联网操作。针对以上情况,引入多线程的处理机制。

2.1利用Thread类与Runnable接口

编写J2ME网络连接应用程序的时候往往借助Command显示部件,调用其事件处理函数完成网络的连接工作,代码框架如下:

publicvoidcommandAction(Commandc,Displayables){

if(c==sendCommand){

requestConnect();//连接方法

}

elseif(

c==backCommand){

display.setCurrent(mainForm);}

else{

destroyApp(false);

notifyDestroyed();}

}

//获取一个HTTP的连接

privatevoidrequestConnect(){

Stringurl=URL.URLString

HttpConnectionhpc=null;

try{

hpc=(HttpConnection)Connector.open(url);

intstatus=hpc.getResponseCode();

if(status!=HttpConnection.HTTP_OK)

content=联机失败!;

else

content=已联机!;

}

catch(IOExceptione){System.out.println(content);}

try{

if(hpc!=null)hpc.close();

}

catch(IOExceptione2){}}

上面的程序工作原理可用图2的工作原理图a来表示。

图2工作原理图a

图2工作原理图a

分析图2可以得出,如果这样的网络连接程序在手机上运行,那么将可能长时间得不到响应。因为连接工作只有一个主线程,所有的应用都是在这个主线程当中进行的,如果此主线程不返回,那么就不能进行后面的行为,用户也不能进行任何操作。

下面改进一下程序,创建一个实现Runnable接口的ConnectPipe类来创建多线程。代码如下

//实现Runnable接口

classConnectPipeimplementRunnable{

……

publicvoidrun(){

requestConnect();}

}

修改commandAction函数:

publicvoidcommandAction(Commandc,Displayables){

if(c==sendCommand){

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top