1. 程式人生 > >Android範例程式設計二:查單詞

Android範例程式設計二:查單詞

這一系列文章的目的是以單個需求為嚮導,十分鐘左右能完成的Android範例程式設計。
生活中避免不了要查單詞,自己寫一個也是很簡單的事情。效果如下:

圖片 本篇主要涉及了Android中的多執行緒以及一個開源庫JSOUP的使用。
首先建立專案
 在專案的
在專案模組的build.gradle中 dependencies節點塊中 新增引用 compile 'org.jsoup:jsoup:1.8.3',JSOUP是一個開源的HTML文件解析庫,可以從網址,字串中解析HTML文件,抽取相關內容,語法類似於JS中的選擇器,支援元素、類、ID的的DOM內容抽取。
 在佈局檔案中
在頂部新增一個EditView,一個Button,做為查詢 再依次新增四個TextView,顯示對應的單詞,音標,解釋,來源,如下圖:
圖片

開啟網頁http://dict.youdao.com/search?q=love,檢視原始碼,可以看到對應的音標CSS類為“phonetic” 對應的解釋類為trans-container,OK,資訊足夠了,可以開始寫業務程式碼了,流程如下
輸入單詞,從網址中獲取對應的HTML文件,解析文件,得到音標和釋義。Android中對網路的操作必須在子執行緒中進行,避免ANR(應用程式無響應),這裡把業務程式碼放在AsyncTask中,在Activity中新建一個內部類,繼承AsyncTask,重寫
doInBackground方法,這個方法是工作在子執行緒中的,從網站獲取音標和解釋。
再重寫 onPreExecute 
onPostExecute方法,這是工作在UI執行緒中的,分別在doInBackground之前和之後執行。
class WordTask extends AsyncTask{
    private String url = "http://dict.youdao.com/search?q=";
    private Document doc;
    private String word;
    private String phonetic = "獲取失敗";
    private String trans = "獲取失敗";
    private String source = "
有道詞典"; public WordTask(){ word = edit_word.getText().toString(); url = url+ word; } @Override protected Object doInBackground(Object[] params) { try { doc = Jsoup.connect(url).timeout(3000).get(); phonetic = doc.select(".phonetic") .first().text(); trans = doc.select(".trans-container") .first().text(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPreExecute() { dialog.show(); super.onPreExecute(); } @Override protected void onPostExecute(Object o) { tv_word.setText(word); tv_phonetic.setText(phonetic); tv_trans.setText(trans); tv_source.setText(source); dialog.dismiss(); super.onPostExecute(o); } }


Activity的OnCreate方法和Button設定監聽器
private EditText edit_word;private TextView tv_word; private TextView tv_phonetic;private TextView tv_trans; private TextView tv_source;private ProgressDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit_word = (EditText) findViewById(R.id.edit_word);tv_word = (TextView) findViewById(R.id.tv_word);tv_phonetic = (TextView) findViewById(R.id.tv_phonetic);tv_trans = (TextView) findViewById(R.id.tv_trans);tv_source = (TextView) findViewById(R.id.tv_source);dialog = new ProgressDialog(this);dialog.setTitle("正在查詢");findViewById(R.id.button_search).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (TextUtils.isEmpty(edit_word.getText().toString())){ Toast.makeText(MainActivity.this,"請填寫要查詢的單詞",Toast.LENGTH_SHORT).show(); return;} InputMethodManager imm = (InputMethodManager) getSystemService(MainActivity.this.INPUT_METHOD_SERVICE);imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);WordTask task = new WordTask();task.execute();} });}  仍然不到一百行,一個完整可用的生詞查詢就完成了。
 為了控制時間,查詢後的單詞存入資料庫,以及生詞本的製作放在接下來的兩篇中。 

 完整程式碼
一句話知識點:
  • gradle是Android Studio中的一個專案自動化構建工具,可輕鬆解決依賴、多渠道打包等問題,是一種動態語言,執行在JVM上。
  • Android中主執行緒為UI執行緒,不應該在UI執行緒中進行耗時操作。
  • AsyncTask是Android框架中的一個輕量執行緒池,實際業務過程中使用較小,因為控制不好可能引起記憶體洩露。 
  • JSOUP是java常用的HTML解析器,甚至可以用來在手機上製作爬蟲。