AutoCompleteTextView からテキストを取得して解析し、Google マップで住所を入力するときと同じように住所のドロップダウン リストを表示する AsyncTask (AddressUpdaterTask) があります。ユーザーが文字を入力するたびに、新しい AddressUpdaterTask が実行されます。私の問題は、ユーザーが入力を開始したときに十分に速く入力すると、前のタスクの実行が完了していない間に新しい AsyncTask が実行されるため、これは効率的ではないことです。
だから私はこれをしました:
AddressUpdaterTask addressUpdaterTask = new AddressUpdaterTask();
addressUpdaterTask はグローバルであり、ユーザーが文字を入力すると、次のようになります。
addressUpdaterTask.cancel(true);
addressUpdaterTask.execute();
したがって、AddressUpdaterTask の 1 つのインスタンスを操作できます。しかし、この方法ではうまくいきません:(どうすれば欲しいものを実装できますか?
編集:これが私のコードです:
public class RegisterDoctor extends Activity {
.
.
.
private AutoCompleteTextView addressField;
private ArrayAdapter<String> adapter;
private Filter filter;
private List<SimpleAddress> simpleAddresses = new ArrayList<SimpleAddress>();
private SimpleAddress currentAddress = null;
AddressUpdaterTask addressUpdaterTask = new AddressUpdaterTask();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register_doctor);
.
.
.
//AutoCompleteTextView Creation
addressField = (AutoCompleteTextView) findViewById(R.id.addressEditText);
addressField.setThreshold(ADDRESS_TRESHOLD);
addressField.setHint("Οδός Αριθμός, Περιοχή");
filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.i("FILTER_ACTION", "Filter:" + constraint);
if (constraint != null && constraint.length() > ADDRESS_TRESHOLD) {
Log.i("FILTER_ACTION", "doing a search ..");
addressUpdaterTask.cancel(true);
addressUpdaterTask.execute();
}
return null;
}
};
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line) {
public android.widget.Filter getFilter() {
return filter;
}
};
addressField.setAdapter(adapter);
adapter.setNotifyOnChange(false);
addressField.setOnItemClickListener(itemClicked);
.
.
.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private AdapterView.OnItemClickListener itemClicked = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View arg1, int pos, long id) {
currentAddress = simpleAddresses.get(pos);
Log.i("ITEM_CLICKED", simpleAddresses.get(pos).getFormatted_address());
}
};
.
.
.
public class AddressUpdaterTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
//adapter.clear();
}
@Override
protected Void doInBackground(Void... voids) {
try {
simpleAddresses = new JsonHelper().getAddresses(addressField.getText().toString());
} catch (NullPointerException e) {
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
int size = simpleAddresses.size();
if (size > 0) {
adapter.clear();
for (int i = 0; i < size; i++) {
adapter.add(simpleAddresses.get(i).getFormatted_address());
Log.i("ADDRESS_ADDED", simpleAddresses.get(i).getFormatted_address());
}
adapter.notifyDataSetChanged();
addressField.showDropDown();
}
super.onPostExecute(aVoid);
}
}
.
.
.
}
編集2:ユーザーが入力した瞬間からのlogcatは次のとおりです=> 6文字(私が設定したしきい値)で、AsyncTaskを実行できます:
10-11 18:56:59.795 1465-1494/com.user.project I/FILTER_ACTION: Filter:panepi
10-11 18:57:02.695 1465-1494/com.user.project I/FILTER_ACTION: Filter:panepis
10-11 18:57:02.695 1465-1494/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:06.544 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepist
10-11 18:57:06.544 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:06.555 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:09.004 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepisti
10-11 18:57:09.004 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:09.014 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:09.904 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepistim
10-11 18:57:09.904 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:09.914 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:10.194 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepistimi
10-11 18:57:10.194 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:10.194 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:11.865 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepistimio
10-11 18:57:11.865 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:11.954 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:12.196 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepistimiou
10-11 18:57:12.196 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:12.295 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
10-11 18:57:14.795 404-966/com.android.inputmethod.latin E/ActivityThread: Failed to find provider info for com.android.inputmethod.latin.dictionarypack
10-11 18:57:14.805 404-966/com.android.inputmethod.latin E/BinaryDictionaryGetter: Could not find a dictionary pack
10-11 18:57:14.815 1465-1496/com.user.project I/FILTER_ACTION: Filter:panepistimiou
10-11 18:57:14.815 1465-1496/com.user.project I/FILTER_ACTION: doing a search ..
10-11 18:57:14.815 1465-1496/com.user.project W/Filter: An exception occured during performFiltering()!
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.user.project.RegisterDoctor$2.performFiltering(RegisterDoctor.java:104)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)