Kuix 错误处理机制标签:Kuix,kalmeo,ExceptionFrame,org,错误处理,机制,public From: https://blog.51cto.com/defonds/5782383
最近在做手机软件,暂时选定 JavaME 作为开发语言,而 Kuix 作为界面开发框架。总体来说,使用 Kuix 做出来的界面还是很漂亮的,兼容性也不错。项目进入收尾阶段,发现错误处理还没有做。一旦抛出异常,就把异常信息赤裸裸地展示给用户了。比如我写的一个类 com.defonds.frame.BusTravelProgram 里抛出了空指针异常,当前页面就会有一个提示框,内容可能是“com.defonds.frame.BusTravelProgram$1@698d1af:java.lang.NullPointerException”,如下图所示。这显然是不能容忍的。可惜的是,关于 Kuix 的中文资料很少,而关于 Kuix 框架的错误处理的中文资料更是少之又少。于是作者不得不去“造轮子”,自己看 Kuix 源码、查国外英文资料、结合自己错误处理经验,总结了这一篇“Kuix 错误处理机制”,只为了方便更多的 Kuix 爱好者。其中的观点肯定有错误或者不足之处,敬请各位批评指正。
记得一位企业家说过:“我去参观别的公司,衡量这个公司文化的标准就看两个地方:一个是食堂,另一个是厕所。”。作者非常认同这个观点。同样,任何优秀的软件,它拥有的应该不仅仅是华丽的外表、强大的功能,还应该有对错误处理的支持。Kuix 框架也有它自己的错误处理机制。
限于篇幅和时间,作者在这里仅仅把如何在项目中使用 Kuix 的错误处理机制。关于更多 Kuix 错误处理机制的深入研究,请参考 Kuix 的官方文档和相关源码。Kuix 是一个开源、免费的作品,文档和源码并不难找。
第一步:写一个异常处理器,司责出现错误后进行的操作。
这个要实现 org.kalmeo.util.worker.WorkerErrorListener,在 onWorkerError 对程序中抛出的错误进行捕捉并处理,在 onWorkerException 方法里对程序中抛出的异常进行捕捉并处理。源代码如下:
/**
* 文件名:KuixExceptionHandler.java
*
* 版本信息:
* 日期:2010-1-14
* Copyright XXX Corporation 2010
* 版权所有
*
*/
package com.defonds.util;
import org.kalmeo.kuix.core.Kuix;
import org.kalmeo.util.worker.WorkerErrorListener;
import org.kalmeo.util.worker.WorkerTask;
import com.defonds.frame.ExceptionFrame;
/**
*
* 项目名称:BusTravel
* 类名称:KuixExceptionHandler
* 类描述:项目异常处理器类
* 创建人:Defonds
* 创建时间:2010-1-14 上午10:38:04
* 修改人:Defonds
* 修改时间:2010-1-14 上午10:38:04
* 修改备注:
* @version
*
*/
public class KuixExceptionHandler implements WorkerErrorListener {
/**
* 创建一个新的实例 KuixExceptionHandler.
*
*/
public KuixExceptionHandler() {
System.out.println("Kuix 错误处理器就绪。。。");
}
/**
* 实现 org.kalmeo.util.worker.WorkerErrorListener 的 onWorkerError 方法
* 对程序中抛出的错误进行捕捉处理
*/
public void onWorkerError(WorkerTask task, Error error) {
/**
* 这里对所有错误进行统一处理,你也可以针对不同类型的错误进行不同处理
*/
ExceptionFrame mf = new ExceptionFrame();
Kuix.getFrameHandler().removeAllFrames();
Kuix.getFrameHandler().pushFrame(mf);
mf = null;
}
/**
* 实现 org.kalmeo.util.worker.WorkerErrorListener 的 onWorkerException 方法
* 对程序中的抛出的异常进行捕捉处理
*/
public void onWorkerException(WorkerTask task, Exception exception) {
/**
* 这里对所有异常进行统一处理,你也可以针对不同类型的异常进行不同处理
*/
ExceptionFrame mf = new ExceptionFrame();
Kuix.getFrameHandler().removeAllFrames();
Kuix.getFrameHandler().pushFrame(mf);
mf = null;
}
}
第二步:在一个程序启动后必定被加载的类中(一般就是程序入口了,即 KuixMIDlet 类中)加入一个错误处理器的实例变量:
/**
* 错误处理器就绪
*/
private KuixExceptionHandler kuixExceptionHandler = new KuixExceptionHandler();
然后再在这个类加载时必定走的方法中加入以下代码(作者写在了继承了 KuixMIDlet 的类的 initDesktopContent 方法中:
/*
* 载入 WelcomeFrame
*/
public void initDesktopContent(Desktop desktop) {
WelcomeFrame wf = new WelcomeFrame();
Kuix.getFrameHandler().pushFrame(wf);
Worker.instance.setWorkerErrorListener(kuixExceptionHandler);
}
最后写一个出现错误后的提示界面,代码如下所示:
/**
* 文件名:ExceptionFrame.java
*
* 版本信息:
* 日期:2010-1-14
* Copyright XXX Corporation 2010
* 版权所有
*
*/
package com.defonds.frame;
import org.kalmeo.kuix.core.Kuix;
import org.kalmeo.kuix.core.KuixConstants;
import org.kalmeo.kuix.widget.Screen;
import org.kalmeo.util.frame.Frame;
import com.defonds.util.Tools;
/**
*
* 项目名称:BusTravel
* 类名称:ExceptionFrame
* 类描述:异常处理界面
* 创建人:Defonds
* 创建时间:2010-1-14 上午11:33:01
* 修改人:Defonds
* 修改时间:2010-1-14 上午11:33:01
* 修改备注:
* @version
*
*/
public class ExceptionFrame implements Frame {
/**
* 设置显示内容
*/
private Screen screen = null;
/**
* 拼成的 xml 结果字符串
*/
private StringBuffer stringBuffer = new StringBuffer();
/**
* 创建一个新的实例 ExceptionFrame.
*
*/
public ExceptionFrame() {
this.stringBuffer.append("<screen title='出错啦!' style="transition:slide(left);" mce_style="transition:slide(left);">")
.append("<scrollpane id='group' style="bg-color:white" mce_style="bg-color:white">")
.append("<container style="layout:inlinelayout(true,bottom);padding:3 0 5 15;bg-color:white;bg-image:url(bgg_06.png)" mce_style="layout:inlinelayout(true,bottom);padding:3 0 5 15;bg-color:white;bg-image:url(bgg_06.png)">")
.append("<text>对不起,出错啦!</text>")
.append("</container>")
.append("</scrollpane>")
.append("<screenFirstMenu onAction='confirm(#group.focusedwidget.id,#group.focusedwidget.tag)'> 主 页</screenFirstMenu>")
.append("<screenSecondMenu onAction='exit'>退 出</screenSecondMenu>")
.append("</screen>");
}
/**
* 实现 Frame 的 onAdded 方法
*/
public void onAdded() {
screen = Kuix.loadScreen(Tools.StrToIs(this.stringBuffer.toString()),null);
screen.setCurrent();
}
/**
* 实现 Frame 的 onMessage 方法
*/
public boolean onMessage(Object identifier, Object[] arguments) {
if ("exit".equals(identifier)){
Kuix.alert("确认退出?", KuixConstants.ALERT_YES | KuixConstants.ALERT_NO, "doexit", null);
}else{
MainPageFrame mf = new MainPageFrame();
Kuix.getFrameHandler().removeAllFrames();
Kuix.getFrameHandler().pushFrame(mf);
mf = null;
}
return false;
}
/**
* 实现 Frame 的 onRemoved 方法
*/
public void onRemoved() {}
}
这样就可以了。下面是作者异常处理页面。作者美工底子比较差,这篇例子只演示功能实现。读者可以自行设计界面。