- 浏览: 725436 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lingsuch:
Android网络连接判断与处理 -
月光照着我:
写的不错,作为笔记了
Android中LayoutInflater的使用 -
智博王锋:
好文章是要顶的!
Android中LayoutInflater的使用 -
云南白药:
...
Android中LayoutInflater的使用 -
万新one:
理解了许多。解释的不错。3Q.
Android中LayoutInflater的使用
内容提要:
在手机这么小的屏幕上开发使用,难点之一就是频繁的屏幕切换。尽管midp2.0的UI部分已经很丰富了,但这些UI部件都是基于事件回调的。这在处理大量的、基本的问答式交互时显得力不从心。
本文实现了一个阻塞当前线程的对话框,简要地说,你可以运用诸如win32API中dialog函数那样的方式来实现对话框并阻塞等待返回值,然后根据返回值执行 不同的处理。听起来很诱人吧。
正文:
疑问何在?
首先回顾一下midp UI的事件处理机制。有两个要素:
1)首先UI部分由系统的一个线程负责维护。也就是说不能阻塞系统的事件处理要领。
2)事件处理运用的是一种回调机制。首先UI部件运用诸如setCommandListener之类的要领为自己注册一个回调接口(其中的回调要领由用户实现);等到触发了相应事件就调用这个注册好的接口的回调要领。
以下是一个实现了CommandListener的类的代码片断:
Form f=new Form("Hello world");
f.addCommand(exit);
f.setCommandListener(this);
可以想象基于事件回调的处理方式,在处理大量的、基本的问答式交互时显得力不从心。你不得不为每一个仅仅是询问要不要继续的对话框而实现一个又一个类,或者处理一个复杂的回调函数。如果选择后者,那么在一个又一个的if-else中处理不同逻辑事件的代码片断一定会烦死你。
较好的做法
这时候我们不免怀念一下win32 Api中对话框函数的处理方式:
int choose=Dialog(title,type……);
if(choose==OK){……}
else if(choose==Cancel){……}
这样处理将会阻塞当前线程,等待返回值,然后根据返回值执行 处理。这样做很cool的原由就是在一个逻辑性很完整的任务中,你可以一次性在一个回调要领中完成所有逻辑,而不必为了问询基本的YES/NO疑问而在不同的类中间跳来跳去。
如何在MIDP下实现
我们遇到的第一个疑问来自于我们的要领必须要阻塞当前线程等待返回值。也就是说,这个对话框不能在UI的回调中直接运行,比如commandAction中。处理办法是将所有的事件处理都放到一个线程类中处理。(这是一点额外的负担,但不可防止)。还好这个工作量不大,要想实现两个对象之间的通信也不难。
第二个疑问是如何 阻塞当前的线程,我们祭出Java线程的三板斧之wait()/notifyAll()。我们可以指定一个信号量(初值false),当其为false时阻塞当前线程,在得到用户通知后将信号量改为true,并唤醒线程。
演示源码:
package dialog; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class DialogTest extends MIDlet implements CommandListener { Display display; Form f = new Form("DialogTest"); Command showCMD = new Command("show", Command.ITEM, 1); public DialogTest() { super(); display = Display.getDisplay(this); f.addCommand(showCMD); f.setCommandListener(this); display.setCurrent(f); } protected void startApp() throws MIDletStateChangeException { } protected void pauseApp() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } public void commandAction(Command c, Displayable d) { new work1(c).start(); } class work1 extends Thread { Command c; public work1(Command c) { super(); this.c = c; } public void run() { // super.run(); if (c == showCMD) { int choose = new Dialog(display).show("Choose", "Do you like your Operation?", "yes", "no"); if (choose == Dialog.YES) { f.append("Yes,user like\n"); } else if (choose == Dialog.NO) { f.append("No,user like\n"); } display.setCurrent(f); } } } }
package dialog; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; class DialogForm extends Form implements CommandListener {// UI部分 Command yesCMD; Command noCMD; Dialog dialog; public DialogForm(Dialog dialog, String title, String content, String yes, String no) { super(title); this.dialog = dialog; append(content); yesCMD = new Command(yes, Command.OK, 1); noCMD = new Command(no, Command.CANCEL, 1); addCommand(yesCMD); addCommand(noCMD); setCommandListener(this); } public void commandAction(Command c, Displayable d) { if (c == yesCMD) { dialog.setBlockFlag(true); dialog.setReturnValue(Dialog.YES); dialog.wakeup(); } else if (c == noCMD) { dialog.setBlockFlag(true); dialog.setReturnValue(Dialog.NO); dialog.wakeup(); } } }
package dialog; /* *为j2me提供阻塞的dialog调用要领。 *但前提是,如果要在UI的相应线程中运行(比如commonAction), *则需首先打开一个新的线程中运用,因为UI线程是不可以阻塞的。 *这个版本虽然包含在coreUI2.0中,但midp1.0也可以用。seimens s57通过测试。 * */ import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; /** * @author Favo */ public class Dialog {// 主类 private boolean blockFlag = false; public static int YES = 0; public static int NO = 1; private int returnValue; private Display display; public Dialog(Display display) { this.display = display; } public void setReturnValue(int i) {// 配置返回值 returnValue = i; } synchronized boolean getBlockFlag() {// 取得信号量 return blockFlag; } synchronized void setBlockFlag(boolean flag) {// 配置信号量 blockFlag = flag; } public int show(String title, String content, String yes, String no) { setBlockFlag(false); Form f = new DialogForm(this, title, content, yes, no); display.setCurrent(f);// 显示UI try { while (getBlockFlag() == false) {// 如果用户没选择阻塞 synchronized (this) { wait(); } } } catch (InterruptedException e) { e.printStackTrace(); System.out.println("InterruptedException in Dialog.show"); } return returnValue;// 返回 } public void wakeup() { synchronized (this) {// 唤醒阻塞的线程 notifyAll(); } } }
发表评论
-
J2ME 第三方开源库(UI扩展等.)
2012-07-02 00:31 996J2ME自带UI不是太美观,使用起来也不太 ... -
解决J2me项目使用第三方jar包引发的问题.
2012-02-12 21:53 1993使用了第三方包引发的问题: 1.配置模拟器时报Set Pla ... -
J2me-WMA编程(无线消息接口)
2010-07-02 14:04 15511 WMA编程 1.1 WMA概述:(wireless M ... -
J2me点阵字
2010-07-02 14:02 1334前言:开发J2ME过程中,我们会发现平台本身提供的字体太小,而 ... -
各种优化J2me的开源库
2010-03-01 21:22 1139J2ME自带UI不是太美观,使用起来也不太 ... -
J2me Property属性表
2010-01-14 19:19 957在J2ME开发中,我们经常需要和手机系统进行交互,获得一些和系 ... -
PNG数据分析
2010-01-14 18:20 2482png图片的压缩与解压缩 ... -
FileConnection访问本地文件系统
2010-01-14 17:46 2022FC api是JSR 75, PDA Optional Pac ... -
RMS笔记
2010-01-14 17:02 1185RMS(Record Management System)是M ... -
J2me FileConnection
2010-01-14 17:00 2134J2me文件系统 几个问题 1,可选包的概念 什么是J2 ... -
J2me实现半透明效果
2009-10-30 19:44 2327在J2ME MIDP1.0规范中并未实现半透明 功能,只有少数 ... -
J2ME读取各种格式的文本文件
2009-10-30 19:09 2396在J2ME中读取各种格式的文本文件 在J2ME开发过程中 ... -
由jar文件生成jad文件
2009-10-20 14:18 2793首先说明的是JAD文件是干嘛用的。用数据线上传游戏或电子书时, ... -
J2me的27种字体效果(不包括下划线)(附图)
2009-09-01 01:05 2151import javax.microedition.lcdui ... -
Eclipse单步调试j2me程序
2009-08-27 18:59 3549使用Eclipse调试J2ME程序 Eclipse ... -
安装SonyEricsson_J2ME_SDK
2009-07-04 09:40 1138最近研究J2ME,在搭建开发平台后运行程序时出现了一些问题,开 ... -
eclipse及中文包下载地址
2009-07-01 14:16 3576eclipse及中文包下载地址 eclipse最新版官方下 ... -
J2me getProperty(String key)之五字段含义.
2009-06-30 21:23 1273import javax.microedition.lcdui ... -
destroyApp()参数说明
2009-06-10 21:16 1581destroyApp是一个callback,它是一个接口或者说 ... -
Could not find jar tool executable
2009-05-27 15:10 2043Could not find jar tool executa ...
相关推荐
J2ME实现的断点续传,解决下载文件问题
用J2ME实现短信功能,客户端和服务器端都有
用j2me 实现打电话的一个小功能 在真机上已经测试过
这是我开发的J2ME实现画图程序,希望大家能互相学习交流
用J2ME实现简单电子邮件发送功能 用J2ME实现简单电子邮件发送功能
基于J2ME的移动支付系统终端应用的实现
j2me 实现抛物线的两种方法 j2me 实现抛物线的两种方法 j2me 实现抛物线的两种方法 j2me 实现抛物线的两种方法 j2me 实现抛物线的两种方法
基于J2ME的手机应用软件的研究,是一篇学年论文
J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码
介绍了目前J2ME的多个开源框架,并分析了这些框架
j2me 实现文件选择组件,播放池,视频播放
使用j2me平台编写的电话本小程序 实现增删改查功能
j2me 基础框架 及基础知识可以帮助入门
j2me实现mvc的框架源码j2me实现mvc的框架源码j2me实现mvc的框架源码j2me实现mvc的框架源码
和大家共享一下用CANVAS来实现中文打字,真的不错哦!因为汉字太多,收录的字有限,我把工程放上来,大家觉得差什么字可以自己加!
J2ME应用软件测试指南.pdf
J2ME应用程序性能优化J2ME应用程序性能优化
j2me手机游戏 j2me手机游戏 j2me手机游戏 j2me手机游戏 j2me手机游戏j2me手机游戏 j2me手机游戏
j2me实现的一个简单的菜单选择项程序,用GameCanvas
优秀论文\应用J2ME实现手机游戏优化技术的研究与实现,毕业论文设计,毕业答辩,手机游戏,J2ME。