本文将讨论如何从BES上远程查找联系人。
背景
如果你的Blackberry能够使用BES,或者已经激活,那么在地址簿里会多一个菜单,即lookup,如下图
这个lookup和Find是有区别的。区别在于Find是从本地查找,而lookup则是远程查找,即从BES服务器上查找联系人。
BES上的联系人是什么样的?其实就是已经在BES上注册过的联系人,这对于一些企业是非常有帮助的。
概念
Blackberry的概念里,对以上的功能有一个定义,叫GAL,全称为Global Address Lookup。
实现原理
有个问题是,我们如何通过编程的方式去实现呢,幸运的是,Blackberry已经提供相关的API。请参看BlackberryContactList.lookup.原型为:
public void lookup(Contact matching, RemoteLookupListener listener) throws IllegalArgumentException public void lookup(String matching, RemoteLookupListener listener) throws IllegalArgumentException
很明显,我们会用后者。查找一个字符串,其结果将在RemoteLookupListener 的items方法里处理。
具体实现
很明显,我们必须定义RemoteLookupListener接口,该如何实现呢?
我们可以这样:
public final class ContactListScreen implements RemoteLookupListener { private Vector _vecLookupContacts ; public ContactListScreen(){ _vecLookupContacts = new Vector(); } /** * Override. */ public void items(Enumeration results) { int count = 0; while (results.hasMoreElements()){ this._vecLookupContacts.addElement(results.nextElement()); ++count; } System.out.println("Number of Contacts: " + count); } }
问题
a) 问题1
如果你在模拟上运行将会出现如下的错误:
Name: NullPointerException GUID: 9c3cd62e3320b498 Time: Apr 07, 2008 07:48:47 No detail message net_rim_bb_apps_framework-3 DefaultSendThread$SendThreadCollector run 0x154E
这是什么原因呢?让我们仔细分析一下。
既然是从BES上查找数据,那么首先要有相应的service book,负责GAL的是ALP service book,检查一下service book是否包含类似Desktop[ALP]。如果没有的话,就会报出上面的错误,所以会有NullPointerException。
如果有该服务,service book列表如下:
为了检查是否有ALP service book,我们可以通过编程的方式来确定。这样可以在使用的过程中根据这个条件要不要启用这个功能。具体代码如下:
public boolean isALPReady { ServiceBook sb = ServiceBook.getSB(); ServiceRecord[] srs = sb.getRecords(); for(int index = 0; index <srs.length ;index++) { if( srs[index].getCid().equalsIgnoreCase( "ALP" )) { return true; } } return false; }
上面的函数返回true,说明已经有了ALP,否则就没有。
b) 问题2
当你想将查询的联系人显示在界面上时,您极有可能碰到如下的异常(这个错误是没法在程序里捕获到的)
ui engine accessed without holding the event lock
这是因为线程引起的。你可能在想,我没有用到线程啊。别忘了lookup这个方法内部调用了。
为了解决这个问题,方法很多,常用的是调用invokeLater来解决。这是另外一个问题,不在这里赘述了。
预告:
下期打算写控件方面的,如果您有什么好的建议,请告诉我。
学习