每周一技:从BES服务器上lookup联系人

本文将讨论如何从BES上远程查找联系人。

背景

如果你的Blackberry能够使用BES,或者已经激活,那么在地址簿里会多一个菜单,即lookup,如下图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

很明显,我们会用后者。查找一个字符串,其结果将在RemoteLookupListeneritems方法里处理。
具体实现
很明显,我们必须定义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列表如下:

sb1

为了检查是否有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来解决。这是另外一个问题,不在这里赘述了。

预告:

下期打算写控件方面的,如果您有什么好的建议,请告诉我。

1条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注