一个容易的中英文翻译词典学习(类似灵格斯)二
在中英字典翻译的首界面简单:
一个简单的输入框一个查询按钮,实现功能如下用户输入一个字词,首先在 本地缓存(Map )中查询是否存在相关的的字词的信息。如果不存在,通过Httpclient请求一个远程连接,解析相关的结果。
在代码中重点注意的是进度条和使用:
//创建一个进度条的信息
pdialog = ProgressDialog.show(DetailActivity.this, "请稍等...", "正在请求数据...", true);
//创建一个每一个单词的线程
new Thread(){
public void run() {
//获取单词的相关的信息
final DetailItem detailItem = getDetailItems(word);
//使用手机开发中UI线程 用于更新界面的信息
runOnUiThread(new Runnable() {
@Override
public void run() {
wordTextView.setText(detailItem.getWord());
if (detailItem.getYinbiao() != null){
yinbiaoTextView.setText(Html.fromHtml("<span>[" + detailItem.getYinbiao() + "]</span><br>"));
}
if (detailItem.getDescription() != null){
descTextView.setText(detailItem.getDescription() + "\n");
}
if (!detailItem.getSampleItems().isEmpty()){
StringBuilder sb = new StringBuilder();
int i=1;
for(SampleItem item : detailItem.getSampleItems()){
sb.append(i + ". " + item.getOrig() + "\n");
sb.append(" " + item.getTrans() + "\n\n");
i++;
}
sampleTextView.setText(sb.toString());
}
if (detailItem.getAudioUrl() == null || detailItem.getAudioUrl().trim().length() == 0){
speImageButton.setEnabled(false);
}
currentItem = detailItem;
}
});
//进度条消失的进度条
pdialog.dismiss();
};
}.start();
Andriod中xml的解析:
/**
* 获取解析Document文档
* 使用Dom解析xml信息
* @param result
* @return
* @throws SAXException
* @throws IOException
* @throws ParserConfigurationException
*/
public Document getDocument(String result) throws SAXException, IOException, ParserConfigurationException{
DocumentBuilderFactory docbuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = docbuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(result)));
return doc;
}
远程访问:
/** * 获取查询单词相关的单词信息 * @param word * @return */ private DetailItem getDetailItems(String word){ //从缓存中查询如果查不到,发送请求服务 DetailItem cacheData = cache.get(word); if (cacheData != null){ return cacheData; } DetailItem rt = new DetailItem(); rt.setWord(word); try { //构建请求路径的信息 String urlString = "http://api.dict.cn/ws.php?utf8=true&q=" + URLEncoder.encode(word, "UTF-8"); Map<String,String> paramsMap=getParamsMap(); String result=HTTPClient.executeHttpClientByApache(urlString, paramsMap); if (result!=null&&result.length()>0){ //解析xml的信息 parseDocument(rt, result); } } catch (Exception e) { e.printStackTrace(); } if (cache.size()>100){ cache.remove(cache.keySet().iterator().next()); } cache.put(word, rt); return rt; }
源代码如下:
package com.easyway.android.xdict; import java.io.IOException; import java.io.StringReader; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; import android.text.Html; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; /** * Android远程请求页面解析 * @author longgangbai * @date 2010-5-28 * @version 1.0 * @since JDK6.0 */ public class DetailActivity extends Activity{ //声明一个进度条在查询显示 private ProgressDialog pdialog; private static final String YINBIAO_PATTERN = "<pron>{%}</pron>"; private static final String DESC_PATTERN = "<def>{%}</def>"; /** * 定义本地单词的缓存信息 key:String 表示单词 value:DetailItem单词相关()的信息 */ private static Map<String, DetailItem> cache = new HashMap<String, DetailItem>(); private static DetailItem currentItem = null; //缓存相关单词录音的路径 private static Map<String, MediaPlayer> audioCache = new HashMap<String, MediaPlayer>(); private TextView wordTextView =null; private TextView yinbiaoTextView=null; private TextView descTextView =null; private TextView sampleTextView =null; private Button backButton =null; private ImageButton speImageButton =null; /** * 界面创建调用 * @param savedInstanceState 上下文的信息 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置视图内容 setContentView(R.layout.detail); Intent intent = getIntent(); final String word = intent.getExtras().getString("word"); //创建各种组件的方法 createComponent(word); //绑定事件 bindListener(word); } /** * 添加各种事件 * @param word */ public void bindListener(final String word){ /** * 点击播放按钮的事件(如果存在对应的录音的信息直接播放,否则创建) */ speImageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //缓存获取录音的信息 MediaPlayer cache = audioCache.get(currentItem.getWord()); if ( cache != null){ cache.start(); return ; } MediaPlayer mp = new MediaPlayer(); try { mp.setDataSource(currentItem.getAudioUrl()); mp.prepare(); mp.start(); if (audioCache.size() > 100){ audioCache.remove(audioCache.keySet().iterator().next()); } audioCache.put(currentItem.getWord(), mp); } catch (Exception e) { e.printStackTrace(); } } }); /** * 点击返回按钮的事件 */ backButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); //创建一个进度条的信息 pdialog = ProgressDialog.show(DetailActivity.this, "请稍等...", "正在请求数据...", true); //创建一个每一个单词的线程 new Thread(){ public void run() { //获取单词的相关的信息 final DetailItem detailItem = getDetailItems(word); //使用手机开发中UI线程 用于更新界面的信息 runOnUiThread(new Runnable() { @Override public void run() { wordTextView.setText(detailItem.getWord()); if (detailItem.getYinbiao() != null){ yinbiaoTextView.setText(Html.fromHtml("<span>[" + detailItem.getYinbiao() + "]</span><br>")); } if (detailItem.getDescription() != null){ descTextView.setText(detailItem.getDescription() + "\n"); } if (!detailItem.getSampleItems().isEmpty()){ StringBuilder sb = new StringBuilder(); int i=1; for(SampleItem item : detailItem.getSampleItems()){ sb.append(i + ". " + item.getOrig() + "\n"); sb.append(" " + item.getTrans() + "\n\n"); i++; } sampleTextView.setText(sb.toString()); } if (detailItem.getAudioUrl() == null || detailItem.getAudioUrl().trim().length() == 0){ speImageButton.setEnabled(false); } currentItem = detailItem; } }); //进度条消失的进度条 pdialog.dismiss(); }; }.start(); } /** * 创建组件 * @param word */ public void createComponent(String word){ wordTextView = (TextView) findViewById(R.id.word_textview); wordTextView.setText(word); yinbiaoTextView = (TextView) findViewById(R.id.yinbiao_textview); descTextView = (TextView) findViewById(R.id.desc_textview); sampleTextView = (TextView) findViewById(R.id.sample_textview); backButton = (Button) findViewById(R.id.back_button); speImageButton = (ImageButton) findViewById(R.id.speak_img_button); } /** * 获取查询单词相关的单词信息 * @param word * @return */ private DetailItem getDetailItems(String word){ //从缓存中查询如果查不到,发送请求服务 DetailItem cacheData = cache.get(word); if (cacheData != null){ return cacheData; } DetailItem rt = new DetailItem(); rt.setWord(word); try { //构建请求路径的信息 String urlString = "http://api.dict.cn/ws.php?utf8=true&q=" + URLEncoder.encode(word, "UTF-8"); Map<String,String> paramsMap=getParamsMap(); String result=HTTPClient.executeHttpClientByApache(urlString, paramsMap); if (result!=null&&result.length()>0){ //解析xml的信息 parseDocument(rt, result); } } catch (Exception e) { e.printStackTrace(); } if (cache.size()>100){ cache.remove(cache.keySet().iterator().next()); } cache.put(word, rt); return rt; } /** * 设置查询需要的各种参数 * @return */ public Map<String,String> getParamsMap() { Map<String,String> paramsMap=new HashMap<String,String>(); paramsMap.put("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6"); paramsMap.put("Referer", "http://dict.cn/"); return paramsMap; } /** * 获取解析Document文档 * 使用Dom解析xml信息 * @param result * @return * @throws SAXException * @throws IOException * @throws ParserConfigurationException */ public Document getDocument(String result) throws SAXException, IOException, ParserConfigurationException{ DocumentBuilderFactory docbuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = docbuilderFactory.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSource(new StringReader(result))); return doc; } /** * 相关的xml信息 * @param rt * @param result * @throws FactoryConfigurationError * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ private void parseDocument(DetailItem rt, String result) throws FactoryConfigurationError, ParserConfigurationException, SAXException, IOException { //获取解析Document文档 Document doc=getDocument(result); if(doc==null) { return ; } //获取单词录音的路径 NodeList audioNodes = doc.getElementsByTagName("audio"); if (audioNodes != null && audioNodes.getLength() > 0){ rt.setAudioUrl(audioNodes.item(0).getChildNodes().item(0).getNodeValue()); } //获取音标的信息 List<List<String>> list = Squirrel.extract(YINBIAO_PATTERN, result); if (!list.isEmpty()){ rt.setYinbiao(list.get(0).get(0)); } //获取匹配的描述 List<List<String>> list2 = Squirrel.extract(DESC_PATTERN, result); if (!list2.isEmpty()){ rt.setDescription(list2.get(0).get(0)); } if (list2.get(0).get(0).indexOf("\n")> -1){ System.out.print(true); } NodeList sentNodes = doc.getElementsByTagName("sent"); if (sentNodes != null && sentNodes.getLength() > 0){ for(int i=0;i<sentNodes.getLength();i++){ Node item = sentNodes.item(i); NodeList nodeList = ((Element)item).getElementsByTagName("orig"); String orig = nodeList.item(0).getChildNodes().item(0).getNodeValue(); NodeList nodeList1 = ((Element)item).getElementsByTagName("trans"); String trans = nodeList1.item(0).getChildNodes().item(0).getNodeValue(); SampleItem si = new SampleItem(orig, trans); rt.getSampleItems().add(si); } } } }