编写高效友好的多线程J2ME联网应用

J2ME开发基础全接触:从入门到精通 本文还有配套的精品资源,点击获取 简介:Java 2 Micro Edition (J2ME) 是Java平台的一个子集,专为嵌入式系统和移动设备等物联网应用设计。本教程全面覆盖J2ME开发的基础知识,包括架构、开发环境、核心组件、用户界面、数据存储、网络编程、设备特性和性能优化等关键内容。开发者将学习如何利用MIDP和CLDC等技术,创建具有丰富功能的移动应用程序。本教程... 阅读详情
初次编写J2ME的联网应用程序的时候往往会写出这样的代码:
public void commandAction(Command c, Displayable s) {
    if (c == mExitCommand)
      notifyDestroyed();
    else if (c == mConnectCommand)
      connect();
}
 
  private void connect() {
    String url = getAppProperty("NetworkThreading.URL");
   
    try {
     
      HttpConnection hc = (HttpConnection)Connector.open(url);
      InputStream in = hc.openInputStream();
     
      int contentLength = (int)hc.getLength();
      if (contentLength == -1) contentLength = 255;
      byte[] raw = new byte[contentLength];
........
.......
}
当你运行这样的程序的时候会出现什么问题呢?wtk会提示你联网工作可能会堵塞用户输入,让你到另外一个线程去进行联网操作。OK,那么我们按照他的要求新建一个线程来进行联网,比如这样写:
public void commandAction(Command c, Displayable s) {
  if (c == mExitCommand)
    notifyDestroyed();
  else if (c == mConnectCommand) {
    Thread t = new Thread() {
      public void run() {
        connect();
      }
    };
    t.start();
  }
}
这样联网就可以通过了,那么为什么会这样呢?明白事物背后的原理显得非常的重要,下面我做一下介绍,当程序运行的时候,Application Management Software(应用管理软件)首先初始化一个MIDlet,然后调用他的startApp()方法使得MIDlet进入active状态,这条程序分支就是主线程,他执行其他的方法后都会返回到这个分支上来继续执行。然后联网是个可能堵塞的操作,意味着他可能长时间都不返回。我曾经写的联网程序在手机上运行,的确比较耗费时间。如果他不返回,那么就不能进行后面的操作,用户也不能输入。这样看上去手机就像死了一样,这显然不够友好。看看下面的原理图吧:
Hijacking the system event thread
当我们在应用程序中新建一个线程来处理联网或者浏览大量RMS数据的时候就不一样了。这时候启动线程后主线程会立刻返回,不会堵塞。
Using a new thread for network activity
仔细想想这样同样有不好的地方,尽管他可以正常工作,但是每次用户按下按钮的时候都会有新的线程产生,这样显然不够高效。幸好java中提供了wait()和notify()/notifyAll()来协调这样的问题,我们启动线程后让他进入等待的状态,当用户按下按钮的时候才让他继续运行。代码类似这样:
public synchronized void run() {
  while (mTrucking) {
    try { wait(); }
    catch (InterruptedException ie) {}
    if (mTrucking) connect();
  }
}

public synchronized void go() {
  notify();
}
Using a single worker thread
这样效率比较高了!当用户进行联网操作的时候我们应该做一个提示界面,比如一个动画告诉用户正在进行联网操作。这样比较友好。那么当用户选择联网动作的时候,我们让我提前做好的欢迎界面显示在屏幕上,联网结束后再把返回的结果显示出来。这样就是一个出色的联网应用程序了。下面的这个代码可以在屏幕上描绘一个动画的效果,当然你也可以修改一下做成自己喜欢的样子。
import java.util.*;

import javax.microedition.lcdui.*;

public class WaitCanvas
    extends Canvas {
  private int mCount, mMaximum;
  private int mInterval;
 
  private int mWidth, mHeight, mX, mY, mRadius;
  private String mMessage;
 
  public WaitCanvas() {
    mCount = 0;
    mMaximum = 36;
    mInterval = 100;
   
    mWidth = getWidth();
    mHeight = getHeight();
   
    // Calculate the radius.
    int halfWidth = (mWidth - mRadius) / 2;
    int halfHeight = (mHeight - mRadius) / 2;
    mRadius = Math.min(halfWidth, halfHeight);
   
    // Calculate the location.
    mX = halfWidth - mRadius / 2;
    mY = halfHeight - mRadius / 2;

    // Create a Timer to update the display.
    TimerTask task = new TimerTask() {
      public void run() {
        mCount = (mCount + 1) % mMaximum;
        repaint();
      }
    };
    Timer timer = new Timer();
    timer.schedule(task, 0, mInterval);
  }
 
  public void setMessage(String s) {
    mMessage = s;
    repaint();
  }
 
  public void paint(Graphics g) {
    int theta = -(mCount * 360 / mMaximum);
   
    // Clear the whole screen.
    g.setColor(255, 255, 255);
    g.fillRect(0, 0, mWidth, mHeight);
   
    // Now draw the pinwheel.
    g.setColor(0, 0, 0);
    g.drawArc(mX, mY, mRadius, mRadius, 0, 360);
    g.fillArc(mX, mY, mRadius, mRadius, theta +  90, 90);
    g.fillArc(mX, mY, mRadius, mRadius, theta + 270, 90);
   
    // Draw the message, if there is a message.
    if (mMessage != null)
      g.drawString(mMessage, mWidth / 2, mHeight,
          Graphics.BOTTOM | Graphics.HCENTER);
  }
}

你可以从这里下载SUN提供的实例代码,仔细研究一下一定受益匪浅。

Java技术平台指南:J2SE、J2EE和J2ME深入教程 本文还有配套的精品资源,点击获取 简介:Java技术是IT领域的基石之一,本压缩包提供企业级应用(J2EE)、移动设备应用(J2ME)和个人电脑应用(J2SE)的详细指南。J2SE 6.0提供了核心编程接口,增强了内存管理和文件系统操作。J2EE 1.5简化了企业级应用开发,并加强了Web服务支持。J2ME 2.5专为嵌入式设备设计,扩展了用户界面和设备连接能力。这些文档为... 阅读详情

相关推荐

J2ME中文教程:移动与嵌入式开发指南

本文还有配套的精品资源,点击获取 简介:J2ME(Java 2 Micro Edition)是Java平台用于小型设备开发的子集,本教程提供全面学习资源,帮助开发者掌握在嵌入式和移动设备上开发应用程序的技能。教程覆盖了J2ME的基础知识、架构、开发工具、编程基础、应用发布与部署、性能优化等方面,旨在培养开发者设计适用于多种小型设备的高效Java应用。 1. J2M...

weixin_32535825的博客 3029

J2ME学习笔记(5)

J2ME学习笔记(5)TextBox是一个容器类型的对象(和Form的性质一样)。用法如下所示: package fancy.test; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class ShowTextBox extends MIDlet implements CommandLi

coffee4u的J2ME学习笔记 710

J2ME插件包完整开发工具集实战详解

J2ME采用分层架构设计,通过配置(Configuration)与简表(Profile)的双重抽象机制适配多样化嵌入式设备。其中,面向计算能力受限设备(如功能手机),提供精简的Java虚拟机规范与基础类库(java.langjava.io等),支持16位/32位CPU、内存容量低至128KB的运行环境。在其之上,构建用户交互能力,封装LCDUI界面组件、RMS持久化存储及HTTP网络通信模块,形成完整应用开发框架。二者协同实现“一次编写、多端运行”的轻量级移动开发范式。

weixin_31776191的博客 1036

J2ME连接网络的问题!

我在做一个网络五子棋对战的手机游戏,但是这中间用到一个用户注册,返回其用户id的操作(数据库端用户id是自动编号的)服务器是用的servlet写的,好象有点错误,因为客户端取得的用户id总是 这个数1752460652,但返回的boolean型值能够取得的 servlet内容是: public class usercheck extends HttpServlet { public v

quefan9388的博客 1292

J2ME API中文开发文档完整指南

J2ME(Java 2 Micro Edition)专为资源受限设备设计,采用“配置-简表”(Configuration-Profile)分层架构。其核心由配置(Configuration)和简表(Profile)构成:配置定义底层运行环境与虚拟机能力,如CLDC(Connected Limited Device Configuration)面向低端设备,支持KVM轻量级虚拟机;

weixin_42153793的博客 1815

J2ME手机游戏开发实践:完整源代码分析与学习指南

本文还有配套的精品资源,点击获取 简介:这个压缩包包含一个用Java 2 Micro Edition(J2ME)开发的手机游戏源代码,专为早期智能手机和平板电脑设计。J2ME游戏代码具有良好的注释,非常适合初学者和开发者学习游戏开发的基础概念。通过分析和修改代码,学习者能够掌握游戏逻辑、图形渲染和用户交互等关键技术。项目文件包括Eclipse配置、描述文件、源代码目录和资源...

weixin_36282234的博客 1769

J2ME通过Http协议传输图片(转)

http://www.java3z.com/cwbwebhome/article/article7/735.html?id=1227   曾经在优快云看到多位网友问图片传输的问题,因此决定写篇文章讲述一个问题,最后通过实例演示如何解决这个问题并提供源代码。如

xhp317的专栏 900

J2ME手机泡泡堂游戏开发实战与源码解析

本文还有配套的精品资源,点击获取 简介:J2ME手机泡泡堂游戏是一款基于Java平台的移动设备游戏,它提供了丰富的游戏体验和完整的源代码,为开发者和爱好者提供了宝贵的学习资源。游戏开发涉及图形用户界面、游戏逻辑、碰撞检测、动画处理等多个方面。通过分析源码,开发者可以了解游戏架构和设计模式,学习J2ME游戏开发流程及技巧,并对游戏性能进行优化。 1. J2ME平台介...

weixin_35829279的博客 1045

J2ME中通过Http协议传输图片

作者:mingjava  文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=74曾经在优快云看到多位网友问图片传输的问题,因此决定写篇文章讲述一个问题,最后通过实例演示如何解决这个问题并提供源代码。如果你对联网中的操作以及多线程还不熟悉那么请参考本站如下文章。    <a title="文章标题:编写高效友好的多线程J2M

mobilechannel的专栏 742

电脑Java模拟器KEmulator汉化版免费下载

电脑上专用的游戏模塑器。支持手机网络游戏

Qt6导入QtChart绘制图表(添加组件)

我在按照大佬们的说明添加QtChart时发现,我的电脑上并不能正确的添加QtChart并编译通过,所以在综合了两位大佬的说明又自己探索了一番后,正确编译通过,分享出来,以便同志们节省一些时间。

Nuaa0719301zyx的博客 2950

J2me多线程联网程序

初次编写J2ME的联网应用程序的时候往往会写出这样的代码: public void commandAction(Command c, Displayable s) {     if (c == mExitCommand)       notifyDestroyed();     else if (c == mConnectCommand)       connect()

创业的程序员 1076

MySQL安装最后启动报错--Job for mysqld.service failed because the control process exited with error code. See

MySQL安装最后启动报错: [root@localhost mysql]# systemctl start mysqld Warning: mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units. Job for mysqld.service failed because the control process exited with error code. See "systemctl status m

chenchen的博客 2746

J2ME 进阶

8.多线程    使用多线程有两种方法:,    一是扩展Thread类:继承Thread类,重载Thread类的run方法,必须Thread类的start方法来启动线程      Thread th=new Thread();      th.start();    另一个方法是实现runnable接口:      实现runnable接口的run方法      Thread th=new Th

丁根的专栏 783

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1427

OpenDRIVE车道计算避坑指南:为什么你的poly3曲线总对不齐?

本文深入解析OpenDRIVE标准中车道几何计算的三大核心难题:参数化三次多项式(ParamPoly3)的坐标系转换与参数映射、车道偏移与宽度的优先级判定,以及螺旋线(Spiral)接续的平滑性保障。通过实战案例与代码示例,提供了一套避免车道线错位与曲率不连续的精确计算与验证方法,是高精地图开发与仿真场景构建的实用避坑指南。

q9w8e7r6t5的博客 421

J2ME网络处理

J2ME网络交互之优化: http://fonter.javaeye.com/blog/405137J2ME如何通过cmwap直接访问互连网: http://fonter.javaeye.com/blog/400868 开源一个J2ME解析类(解析HTML,XML,TXT,XHTML,WML) http://fonter.javaeye.com/blog/409830  J

blade2001的专栏 656

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2658
上一篇: J2ME联网中采用序列化机制
下一篇: 在应用程序中处理jar文件
mingjava
博客等级 码龄24年 68粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值