Android Smart Dict - 单词导入 - 词汇表解析

有了一个可以用的文件浏览器之后,我们就可以选择并且得到要加载的词汇表文件。当用户点击了某一个词汇表文件之后,浏览器把此文件返回给词汇表解析器,解析出每一个单词,然后插入数据表。

 

如何解析?为了不在这一部分花费掉太多的时间,我只需要做简单的格式定制和解析就好,后面再做性能上面的优化工作。

 

在其他地方kiang到一个词汇表,格式很简单,就像这样:

 

-------------------------------------------------------------------------

ability  [4'biliti]
n. (U)能力,本领;(C)才能,才智

-------------------------------------------------------------------------

有人一定发现了,音标没显示对,是的,我们后面再来处理这些细节问题。

 

我现在只需要提取三部分出来就可以了,本来也就只有三部分:单词,音标,解释。了便于显示信息给用户,我在文件前面加入一个header,来描述一下这个词汇表的名称和单词数量。用两个关键字来定义开始和结束。类似xml文件的方式,注意是类似,并不完全一致。在这里,我只是为了解析的方便。

 

-------------------------------------------------------------------------

<header>
三个英语词汇
3
</header>

 

<words>

ability  [4'biliti]
n. (U)能力,本领;(C)才能,才智


ability  [4'biliti]
n. (U)能力,本领;(C)才能,才智

able  ['eib4l]
adj. 能够…的,有能力的

 

</words>

-------------------------------------------------------------------------

 

header的名称叫“三个英语词汇”,单词数量是3个,单词部分用<words>和</words>包围起来,单词之间用空行隔开。这样够简单了吧,哈哈哈!

 

我定义一个叫BookParser的类,就负责解析这词库文件,它有一个公开的方法叫getNextWord()返回解析出来的单词对象。

 

代码如下:

 

 

这个一定要注意一点,文件存储为上面格式,在构造Reader的时候就要相应地注明以什么格式读取,比如我的是UTF-8格式。

 

接着我需要用一个类来驱动解析,一个叫BookLoader的类,继承Thread驱动整个解析过程。

它内部有一个Listener,提供一些有用的回调方法。

 

onStart():就是在解析开始之前调用,这里面可以弹出一些dialog显示一些相关信息。

onLoadHeader():这个方法是当解析完header之后,返回给调用者关于词库的信息,可以反馈给用户。

onComplete():这个很明显,在整个load完成以后调用,参数state用来提示状态,成功,还是取消还是出错。

onLoadWord():这个方法在每次load一个单词的时候调用,可以用来即时反馈用户目前在load那个单词。

 

这些方法都是用在UI里边给用户提示相关信息。

 

代码如下:

 

 

为了让UI线程能够即时地显示最新状态,必须在while循环里面每次sleep几毫秒,不然UI的显示就会stutter。

 

现在来看看我在Activity里边做了什么。

主要就是实现OnBookLoadListener这个接口,开始load的时候弹出dialog,当header解析出来以后,显示词库的名称,单词数量,每次load一个单词就相应地显示到dialog里面,完成load以后显示结果信息。

 

代码如下:

 

 

OK,来看看效果如何:

 

 

还行,只是load速度比较慢,因为我们是一条一条地insert所以会很慢,后面我会考虑用transaction来做,这样整个过程就会快很多。

好吧,今天就这样!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值