候補検索
Search()で実行するのだが、遅いことがあるので非同期処理SearchTask()を利用している
SearchTask.execute()でSearch()が呼ばれる
code:Search.java
//
// いろんな辞書を検索するものをまとめる
// その後でまとめてAsyncTaskにする。
//
package com.pitecan.gyaim;
import java.util.Arrays;
//import java.util.ArrayList;
import android.util.Log;
import android.content.res.AssetManager;
import java.io.InputStream;
import java.io.IOException;
class Candidate {
String pat, word;
int weight;
public Candidate(String pat, String word, int weight){
this.pat = pat;
this.word = word;
this.weight = weight;
}
}
public class Search {
private static Gyaim gyaim;
public static Candidate[] candidates = new CandidateGyaim.MAXCANDS; // 候補単語リスト public static int ncands = 0;
public static boolean useGoogle = true; // GoogleIMEで検索するかどうか
public Search(Gyaim gyaim){
this.gyaim = gyaim;
//
// 内蔵固定辞書
//
try {
AssetManager as = gyaim.getResources().getAssets();
InputStream is = as.open("dict.txt");
new LocalDict(is);
} catch (IOException e) {
//e.printStackTrace();
}
//
// 学習辞書(SQL)
//
new SQLDict(gyaim);
for(int i=0;i<Gyaim.MAXCANDS;i++){
candidatesi = new Candidate("","",0); }
}
public static void reset(){
ncands = 0;
}
//
// いろんな辞書を使った検索!
//
public static Candidate[] search(String pat, SearchTask searchTask){
Message.message("Gyaim","Search - pat="+pat);
ncands = 0;
//
// 完全一致モードではひらがな/カタカナを候補に出す
//
if(LocalDict.exactMode){
String hiragana = Romakana.roma2hiragana(pat);
String katakana = Romakana.roma2katakana(pat);
addCandidateWithLevel(hiragana,pat,-100);
addCandidateWithLevel(katakana,pat,-99);
}
//
// クリップボードの単語を候補に出す (新規登録用)
//
if(!LocalDict.exactMode){
String s = gyaim.getNewClipboardText();
if(s != "" && s.length() < 10){ // コピー文字列が短い場合だけ候補にする
addCandidate(s,pat);
}
}
//
// SQLの学習辞書検索
//
String[][] sqldata = SQLDict.search(pat,LocalDict.exactMode);
for(int k=0;k<sqldata.length;k++){
addCandidateWithLevel(sqldatak0,sqldatak1,-50+k); }
//
// 通常のローカル辞書を検索
// 時間がかかることがあるのでSearchTaskでバックグラウンド動作させている。
// 何かキー入力があれば isCancelled() がtrueになる。
//
LocalDict.search(pat,searchTask);
//
// GoogleIME
//
Message.message("Gyaim","UseGoogle = " + useGoogle);
if(useGoogle && !searchTask.isCancelled() && gyaim.isConnected()){
// Google日本語入力APIを利用
Message.message("Gyaim","isConnected() = " + gyaim.isConnected());
String[] words = GoogleIME.convert(Romakana.roma2hiragana(pat));
Log.v("Gyaim","length="+words.length);
for(String word: words){
Message.message("Gyaim","Use Google ... word = "+word);
addCandidateWithLevel(word,KeyController.inputPat(),50);
}
}
// 優先度に従って候補を並べなおし
//for(int j=ncands;j<Gyaim.MAXCANDS;j++){
// candidatesj.weight = 100; //}
// ソートをやめてみたが全く違いがわからない... 要るのだろうか?? (2012/12/11 08:58:42)
//Arrays.sort(candidates, new CandidateComparator());
return candidates;
}
public static void addCandidate(String word, String pat){
addCandidateWithLevel(word,pat,0);
}
public static void addCandidateWithLevel(String word, String pat, int level){
int i;
//Message.message("Gyaim","addCandidate: word="+word+" pat="+pat+" ncands="+ncands+" level="+level);
if(ncands >= Gyaim.MAXCANDS) return;
for(i=0;i<ncands;i++){
if(candidatesi.word == null) break; if(candidatesi.word.equals(word)) break; }
if(i >= ncands){
candidatesncands.weight = level; //Message.message("Gyaim", "Add "+word+" to candidates");
ncands++;
}
}
}
code:SearchTask.java
package com.pitecan.gyaim;
import android.os.AsyncTask;
import android.util.Log;
// <Params, Progress, Result> で型を指定する
public class SearchTask extends AsyncTask<String, Integer, Candidate[]> {
private CandView candView;
public SearchTask(CandView candView){
this.candView = candView;
Message.message("Gyaim","SearchTask: candView = " + candView);
}
public void progress(int i){
publishProgress(0);
}
//
// SearchTask.execute() でこれが呼ばれる
//
protected Candidate[] doInBackground(String... searchParams){ // Result の型を返す 引数はParamsの型
Message.message("Gyaim","doInBackground start......");
Candidate[] res;
String pat = searchParams0; //String word = searchParams1; //if(pat != ""){
if(! pat.equals("")){
res = Search.search(pat,this); // this.cancel()が呼ばれるとthis.isCancelled()がtrueになる
if(isCancelled()){
}
}
else {
Search.ncands = 0;
/*
// 以下は何故か動かない?
Search.addCandidateWithLevel("が","ga",0);
Search.addCandidateWithLevel("は","ha",0);
Search.addCandidateWithLevel("の","no",0);
Search.addCandidateWithLevel("に","ni",0);
Search.addCandidateWithLevel("を","wo",0);
Search.addCandidateWithLevel("。",".",0);
Search.addCandidateWithLevel("、",",",0);
*/
res = Search.candidates;
}
Message.message("Gyaim","doInBackground end");
return res;
}
private void updateView(){
// Message.message("Gyaim","Search.ncands = " + Search.ncands);
int i = 0;
if(Search.ncands > 0){
for(i=0;i<CandView.candButtons.length && i <Search.ncands;i++){
CandView.candButtonsi.text = Search.candidatesi.word; CandView.candButtonsi.pat = Search.candidatesi.pat; }
}
for(;i<CandView.candButtons.length;i++){
CandView.candButtonsi.text = ""; CandView.candButtonsi.pat = ""; }
candView.drawDefault();
}
@Override
protected void onProgressUpdate(Integer... progress) { // Progressの型
// setProgressPercent(progress0); //
// 検索ルーチンで候補がみつかったとき適宜publishProgress()を呼ぶことにより候補表示を速くする。
// publishProgress()が呼ばれるとこのスレッドのonProgressUpdate()が呼ばれる。
//
updateView();
}
@Override
protected void onPostExecute(Candidate[] candidates) { // Result の型の値が引数に入る doInBackgroundの返り値
Log.v("Gyaim","onPostExecute");
// ここで候補を表示する
updateView();
}
@Override
protected void onCancelled(Candidate[] candidates){
Log.v("Gyaim","onCancelled");
}
}