グーグルのような自動提案機能を実装したいのですが。それを行うための最良の方法は何ですか?また、役立つコンポーネントがすでに実装されていますか?
リクエストを送信する頻度が本当に気になります。私の推測では、リクエストはしばらくしてから送信する必要があります。したがって、たとえば、ユーザーが新しいキャラクターを書いたときに、ある種のタイマーをトリガーする必要があります。これにより、タイマーの開始から終了までの入力を比較する関数がトリガーされます。比較の判断で送信するかどうかを判断しましたが、そのためにスレッドを使用する必要があります。リソースを大量に消費する実行ではないでしょうか。
もう1つのオプション:テキストを取得し、リクエストを送信し、メインスレッドの結果ビューを更新するwhile(true)スレッドを作成します。ただし、Androidの観点からはどのように行われるのかわかりません。
提案をありがとう。
UPD:AsyncTasksを使用する簡単なソリューションを考え出しました。新しいSearchInBackgroundTaskが起動されるたびに、元のインスタンスがジョブを終了しない限り、SearchInBackgroundTaskの他のインスタンスが起動されないようにするフラグを設定します。フラグが設定された後、別のSearchInBackgroundTaskの実行が可能になるため、最後の入力文字列は、空でなく、以前に処理されたものと等しくない場合、条件に基づいて処理されます。
それで、それについての考えを提案してください-それは素晴らしい解決策ですか?
public class AsyncTaskForSearchActivity extends Activity {
protected boolean _threadIsWorking = false;
protected String _searchResult;
protected String _searchString;
protected String _processedSearchString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView searchbox = (TextView) findViewById(R.id.searchbox);
searchbox.addTextChangedListener(_searchboxWatcher);
}
protected TextWatcher _searchboxWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
_searchString = s.toString();
if(_threadIsWorking == false){
_performSearchTask();
}
}
};
protected Handler _onRetrieveResult = new Handler(){
public void dispatchMessage(android.os.Message msg) {
if(_threadIsWorking == false && _searchString.length() > 0 && _processedSearchString != _searchString){ // what's the difference bet equeals and ==
_performSearchTask();
}
};
};
protected class SearchInBackgroundTask extends AsyncTask<String, Void, Void>{
protected String _s;
@Override
protected Void doInBackground(String... params) {
_s = params[0];
try {
// httpProvider -> retrieve
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
_searchResult = "xxx";
_threadIsWorking = false;
_onRetrieveResult.sendEmptyMessage(0);
}
}
protected void _performSearchTask(){
_threadIsWorking = true;
_processedSearchString = _searchString;
Toast.makeText(AsyncTaskForSearchActivity.this, _processedSearchString, 1).show();
(new SearchInBackgroundTask()).execute(_processedSearchString);
}
}