`
shappy1978
  • 浏览: 698420 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于Kuix的窗口刷新机制

    博客分类:
  • J2ME
阅读更多

 

    这几天都在看Kuix的源代码,了解它的消息处理机制,事件处理,窗口刷新,内部线程处理等等,其实Kuix的核心代码作者已经标志的很清楚了,org.kalmeo.kuix.core,widget包可以修改控件的一些表现,要理解框架的话还是应该看core包,尤其是KuixCanvas.我把Kuix分为三个部分,首先是框架的内部处理机制,主要是几个内部处理线程,其次是控件的布局管理,再次是xml和css的文件解析和控件包,一般人都会习惯从后面开始入手,我也是这样开始的.

    要说明Kuix的窗口显示机制,还是先从一个案例入手,这个问题,我的程序中从服务器读取数据后,弹出新的窗口(或者更新当前窗口),服务器连接用线程管理,接收后更新界面,保证主线程不会足赛,这会出现一个很奇怪的现象,有时候刷新的界面会弹不出来,按动任何一个键盘界面才会马上显示,而且这个现象是随机出现的,在实机上出现的频率较高,根据你接收数据的处理效率,处理任务更重出现的效率越高,比如我采用了ssl通道加密后,出现界面"停滞"的几率大大增高.

    首先怀疑是接收处理数据的代码有问题,或者数据有异常,接着做的一个测试排除了代码或者数据问题,我打开一个连接后,不读取服务器的数据,直接打开本地的ui,这一现象仍然出现,所以判断为线程同步问题,可是对screen,frame加同步锁后,现象更加明显.实际上这个问题出现了一个多月,一直没有彻底解决,知道最近才有时间解读Kuix的窗口弹出机制.

    先从Desktop.setCurrentScreen入手,Desktop可以认为是Kuix所有容器的顶层容器,setCurrentScreen只是替换了当前screen变量,隐藏原来的窗口和菜单,注意,菜单不是screen的一部分,所以screen.remove只是清空窗口,菜单仍然保留

 

	/**
	 * @param screen the screen to set
	 */
	public void setCurrentScreen(Screen screen) {
		if (this.screen == screen) {
			return;
		}
		if (this.screen != null) {
			this.screen.remove();
		}

		// Hide menuPopups
		Menu.hideAllMenuPopups();
	
		// Check transition
		if (screen != null) {
			Transition transition = screen.getTransition();
			if (transition != null && this.screen != null) {
				Kuix.getCanvas().setTransition(transition);
			}
		}
		
		this.screen = screen;
		if (screen != null) {
			super.add(screen);
		}
	}
 

    继续追到Widget.add函数,主要是修改控件链表,触发添加事件等,主要还是invalidate(),触发界面更新

 

	/**
	 * Invalidate the widget's size and position and propagate the information
	 * to its parent. Calling this method will generate a call to the
	 * <code>doLayout()</code> and </code>paint()</code> method on all
	 * invalidated widgets.
	 * 
	 * @param fromWidget the Widget responsible of the invalidation.
	 */
	protected void invalidate(Widget fromWidget) {
		invalidated = true;
		if (parent != null && !parent.invalidated) {
			parent.invalidate(fromWidget);
		}
	}
 

    这个函数似乎看不出什么有用的东西,关键其实在parent.invalidate ,不断的向上递归调用,直到最顶层的Desktop.invalidate,这里有所不同了.调用Kuixcanvas.revalidateNextFrame,所以前面说过Kuixcanvas是相当核心的类,几乎所有的内部线程都在这个类里面.

 

	/* (non-Javadoc)
	 * @see org.kalmeo.kuix.widget.Widget#invalidate(org.kalmeo.kuix.widget.Widget)
	 */
	public void invalidate(Widget fromWidget) {
		super.invalidate(fromWidget);
		Kuix.getCanvas().revalidateNextFrame();
	}
 

    追到下面的函数似乎线索中断了,一直没发现在哪里刷新界面了

 

	/**
	 * Repaint through the Worker task
	 * 
	 * @param x	x coordinate of the repaint region
	 * @param y y coordinate of the repaint region
	 * @param width width of the repaint region
	 * @param height height of the repaint region
	 */
	public void repaintNextFrame(int x, int y, int width, int height) {
		needToRepaint = true;
		repaintRegion.add(x, y, width, height);
	}
 

    实际上关键就在needToRepaint = true;Kuixcanvas有一个内部线程,里面有这个代码,forceRepaint实际上就是刷新界面的函数了.

 

					// Repaint
					if (needToRepaint) {
						forceRepaint();
					}
 

    所以实际上Kuix所有的事件都是通过线程操作的,而不是实时实现.这会有一些延迟,这个延迟就会导致我们用多线程的时候,界面会被随机"冻结",而操作一个任一个按键,都会触发KuixCanvas的消息处理线程,实际上最终触发重绘界面的函数,导致"迟到"的界面重新出现.


分享到:
评论
2 楼 刀枪剑戟 2012-05-23  
解决方法:
调用以下方法进行刷新
Kuix.getCanvas().repaint();
1 楼 btbird 2010-01-29  
这个问题我也碰到了,在从网络上获取json数据解析显示出来的时候,使用了进度条作为等待画面,里面使用了多线程。页面跳转出现了刷新问题,你这个有的的解决方法吗?我尝试了一下你说的好像还是不怎么行,问题依旧,期待你的回答

相关推荐

    kuix.rar 包括kuix以及kutil和demo

    标题中的"kuix.rar"是一个压缩文件,通常用于存储多个相关文件或文件夹,便于传输和存储。RAR是一种流行的压缩格式,由RarLab开发,它提供了更高的压缩比和更全面的错误修复功能。"kuix"、"kutil"和"demo"是这个...

    J2MEUI框架-Kuix

    目前广泛应用的J2Me框架,Kuix是一个使用XML/CSS来开发的lib,它提供了大部分UI组件,比 如:button,textfields,lists,menus,tabs等)。它的主页是源代码放在google code上,http://code.google.com/kuix,如果要使用...

    j2me开源框架Kuix源码

    总结来说,Kuix是一个针对J2ME平台的强大开源框架,它通过提供丰富的组件、事件处理机制、数据绑定等功能,降低了开发复杂度,提升了开发效率。配合详细的文档和示例,开发者可以更轻松地进入J2ME应用开发的世界。...

    kuix-1.1.0源代码

    首先,kuix-1.1.0是一个针对Java开发的库,其源代码提供了深入理解库功能和内部机制的机会。源代码通常包含了类、接口、方法以及其他相关资源,对于开发者来说,是学习和调试的关键资料。通过查看源代码,我们可以...

    手机界面kuix-1.1.0

    【手机界面kuix-1.1.0】是一款专为移动设备设计的用户界面库,其核心是基于XML和CSS技术构建的。这个库的主要目标是简化开发者在创建应用程序时的UI开发工作,提供了一系列丰富的预定义组件,使得开发者能够快速、...

    kuix-1.1.0

    wm6上面运行流畅,鼠标也是稍慢,进入文本控件后自动弹出输入窗口,无法在界面窗口直接输入。按关闭电话键后退出,5800按功能键退出,可以通过通话或者其他按键切换 kuixkeyvalidator.jar 用于检测输入键盘键值的...

    KUIX详细的中文文档,翻译版本

    【KUIX中文文档概述】 KUIX,全称为Kalmeo J2ME的用户界面扩展,是一个专门针对Java ME应用程序开发的框架。它的主要目标是简化和加速高端J2ME应用的创建,提供丰富的图形元素,如按钮、文本框、列表和菜单,以构建...

Global site tag (gtag.js) - Google Analytics