WAP建站入门教程
来源:yesky
被读3031次
转载请注明出处-中国设计秀-cnwebshow.com
九、定时器
介绍了如何使用定时器来实现动态刷新
WML中的ontimer事件有着很重要的意义。在实现自动刷新和动画方面很有用处。下面就要讲述如何使用ontimer事件来实现一个自动刷新的时钟程序。
在实现自动刷新的过程中一个十分重要的问题就是Cache。Cache在WAP中有很重要的作用,但是同时它也给程序编制人员带来了很多不方便。例如:当我反复地查询同一支股票信息的时候,如果不采取防止Cache的方法,那么结果只能是一个。这显然是不正确的。那么如何防止这种情况发生呢?在WAP问答中有详细的解答。但是这里将采用一种最简单的办法,那就是使得用户所产生的URL请求没有一次是相同的。即使出现相同,那么手机的内存无法保留那么多的页面内容。
时钟的例子程序如下:(需要注意到WML页面和动态生成程序)
在实现自动刷新的过程中一个十分重要的问题就是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>
<?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.wmlnn");
*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-%dn"));
*pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%H:%m:%Sn"));
*pCtxt<<_T(" </p>n");
*pCtxt<<_T(" </card>n");
*pCtxt<<_T("</wml>");
}
{
AddHeader(pCtxt,"Content-type: text/vnd.wap.wmlnn");
*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-%dn"));
*pCtxt<<(LPCTSTR)tmCurrent.Format(_T("%H:%m:%Sn"));
*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.wmlnn");
*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>");
}
{
nID=nID%67+1;
AddHeader(pCtxt,"Content-type: text/vnd.wap.wmlnn");
*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电子地图的自动更新。