九、定时器
介绍了如何使用定时器来实现动态刷新
WML中的ontimer事件有着很重要的意义。在实现自动刷新和动画方面很有用处。下面就要讲述如何使用ontimer事件来实现一个自动刷新的时钟程序。
在实现自动刷新的过程中一个十分重要的问题就是Cache。Cache在WAP中有很重要的作用,但是同时它也给程序编制人员带来了很多不方便。例如:当我反复地查询同一支股票信息的时候,如果不采取防止Cache的方法,那么结果只能是一个。这显然是不正确的。那么如何防止这种情况发生呢?在WAP问答中有详细的解答。但是这里将采用一种最简单的办法,那就是使得用户所产生的URL请求没有一次是相同的。即使出现相同,那么手机的内存无法保留那么多的页面内容。
时钟的例子程序如下:(需要注意到WML页面和动态生成程序)
Main.wml
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" ontimer="http://127.0.0.1/wap/wapd.dll?GetTime?ID=100" title="Main">
<timer name="wait1" value="60"/>
<p>
Wait for a moment...
</p>
</card>
</wml>
动态时钟程序的核心:
void CWAPExtension::GetTime(CHttpServerContext* pCtxt,int nID)
{
AddHeader(pCtxt,"Content-type: text/vnd.wap.wml\n\n");
*pCtxt<<_T("<?xml version=\"1.0\"?>\n");
*pCtxt<<_T("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN");
*pCtxt<<_T("\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
*pCtxt<<_T("<wml>\n");
CString strCard;
strCard.Format(_T("<card id=\"time\" ontimer=\"http://127.0.0.1/wap/wapd.dll?GetTime?ID=%d\" title=\"Time\">\n"),++nID);
*pCtxt<<(LPCTSTR)strCard;
CString strWait;
strWait.Format(_T("<timer name=\"wait%d\" value=\"60\"/>"),nID);
*pCtxt<<(LPCTSTR)strWait;
*pCtxt<<_T(" <p>\n");
CTime tmCurrent=CTime::GetCurrentTime();
*pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%Y-%m-%d\n"));
*pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%H:%m:%S\n"));
*pCtxt<<_T(" </p>\n");
*pCtxt<<_T(" </card>\n");
*pCtxt<<_T("</wml>");
}
我们注意到nID在不断增加,那么就意味着nID就不可能相同。那么每次的URL就不会相同,手机每次必须去服务器取回内容。大家同时也注意到了ontimer的name怎么也在不断地改变呢?这个是一个很有意思的事情:在UpPhone和Nokia WAP Toolkit 1.2中,如果不改变这个ID,那么就只出现一次刷新,这是为什么呢?很简单,他们将timer这个变量做为全局变量保存了下来,再下一次进来的时候,忘记将timer的value重新赋值了。但是这也不是一个最好的解决办法。你会发现UpPhone在运行128次后就死掉了。为什么?因为每次不同,它都作为全局的timer,因此最多只能有128个timer。怎么办呢?最好的程序在下面:
void CWAPExtension::GetNext(CHttpServerContext* pCtxt,int nID)
{
nID=nID%67+1;
AddHeader(pCtxt,"Content-type: text/vnd.wap.wml\n\n");
*pCtxt<<_T("<?xml version=\"1.0\"?>\n");
*pCtxt<<_T("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN");
*pCtxt<<_T("\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
*pCtxt<<_T("<wml>\n");
*pCtxt<<_T("<card id=\"humor\" title=\"Picture\">\n");
*pCtxt<<_T(" <onevent type=\"ontimer\">\n");
CString strGoTo;
strGoTo.Format(_T(" <go href=\"http://127.0.0.1/wap/wap.dll?GetNext?ID=%d\">\n"),nID);
*pCtxt<<(LPCTSTR)strGoTo;
*pCtxt<<_T(" <setvar name=\"wait\" value=\"150\"/>\n");
*pCtxt<<_T(" </go>\n");
*pCtxt<<_T(" </onevent>");
*pCtxt<<_T(" <timer name=\"wait\" value=\"150\"/>");
*pCtxt<<_T(" <p>\n");
CString strImage;
strImage.Format(_T(" <img alt=\"wbmp%d\" src=\"http://127.0.0.1/wap/%d.wbmp\"/>\n"),nID,nID);
*pCtxt<<(LPCTSTR)strImage;
*pCtxt<<_T(" </p>\n");
*pCtxt<<_T(" </card>\n");
*pCtxt<<_T("</wml>");
}
这个程序相比之下就好多了。但是在UpPhone上运行还是有问题。已经有同志使用这种方法实现了WAP电子地图的自动更新。

[
1] [
2] [
3] [
4] [
5] [
6] [
7] [
8] [
9] [
10] [
11] [
12] [
13] [
14]
[15] [
16]

2006-12-23 11:47:00 出处:
yesky