我在我的应用程序中使用 AIButton
并且我有一个 AsyncTask
,它在单击 AIButton 并收到一些命令后执行,而 AsyncTask 有时执行时间太长。
这是我的代码:
final AIConfiguration config = new AIConfiguration("xxx",
AIConfiguration.SupportedLanguages.English,
AIConfiguration.RecognitionEngine.System);
listenButton = (AIButton) findViewById(R.id.micButton);
config.setRecognizerStartSound(getResources().openRawResourceFd(R.raw.test_start));
config.setRecognizerStopSound(getResources().openRawResourceFd(R.raw.test_stop));
config.setRecognizerCancelSound(getResources().openRawResourceFd(R.raw.test_cancel));
listenButton.initialize(config);
listenButton.setResultsListener(this);
这是 AsnycTask
:
class translate extends AsyncTask<String, Void, String> {
String translatedText = "";
@Override
protected void onPreExecute() {
super.onPreExecute();
loading.setMessage("Loading");
loading.show();
}
@Override
protected String doInBackground(String... params) {
String text = params[0];
String toBeConvertedIn = params[1];
Log.d("TEXT", text);
Log.d("TBCI", toBeConvertedIn);
try {
String encodedText = URLEncoder.encode(text, "UTF-8");
HttpHandler httpHandler = new HttpHandler();
String url = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=xxxxxxx&text=" + encodedText + "&lang=" + toBeConvertedIn;
String jsonStr = httpHandler.makeServiceCall(url);
if (jsonStr != null) {
Log.e(TAG, "Response from url: " + jsonStr);
try {
JSONObject jsonObj = new JSONObject(jsonStr);
Log.d("jsonObj", String.valueOf(jsonObj));
JSONArray translatedTextObj = jsonObj.getJSONArray("text");
for (int i=0; i<translatedTextObj.length(); i++) {
translatedText = translatedTextObj.getString(i);
Log.d("translatedText", translatedText);
}
} catch (JSONException e) {
Log.d(TAG, e.getMessage());
}
} else {
Log.e(TAG, "Couldn't get json from server.");
}
} catch (UnsupportedEncodingException e) {
Log.d(TAG, e.getMessage());
}
return translatedText;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
hTV.setText(s);
if (loading.isShowing()) {
loading.dismiss();
}
}
}
我在 onResult()
方法中调用上面给定的 AsyncTask
,如下所示:
public void onResult(final AIResponse response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onResult");
Log.i(TAG, "Received success response");
// this is example how to get different parts of result object
final Status status = response.getStatus();
Log.i(TAG, "Status code: " + status.getCode());
Log.i(TAG, "Status type: " + status.getErrorType());
final Result result = response.getResult();
Log.i(TAG, "Resolved query: " + result.getResolvedQuery());
Log.i(TAG, "Action: " + result.getAction());
final String speech = result.getFulfillment().getSpeech();
final Metadata metadata = result.getMetadata();
if (metadata != null) {
Log.i(TAG, "Intent id: " + metadata.getIntentId());
Log.i(TAG, "Intent name: " + metadata.getIntentName());
}
final HashMap<String, JsonElement> params = result.getParameters();
if (params != null && !params.isEmpty()) {
Log.i(TAG, "Parameters: ");
for (final Map.Entry<String, JsonElement> entry : params.entrySet()) {
switch (response.getResult().getMetadata().getIntentName()) {
case "Translate":
if (entry.getValue() != null) {
if (entry.getKey().equals("translate")) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.translate_alertdialog, null);
dialogBuilder.setView(dialogView);
final EditText textToTranslate = (EditText) dialogView.findViewById(R.id.text_to_translate);
final AutoCompleteTextView chooseLanguage = (AutoCompleteTextView) dialogView.findViewById(R.id.choose_language);
ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, languages);
chooseLanguage.setAdapter(adapter);
dialogBuilder.setTitle("What should I translate?");
dialogBuilder.setPositiveButton("Translate", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if (!textToTranslate.getText().toString().isEmpty()) {
if (!chooseLanguage.getText().toString().isEmpty()) {
switch (chooseLanguage.getText().toString().toLowerCase()) {
case "french":
new translate().execute(textToTranslate.getText().toString(), "az");
break;
}
}
}
}
});
dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//pass
}
});
AlertDialog b = dialogBuilder.create();
b.show();
} else {
Log.d("null", "No translate parameter");
}
} else {
Log.d("null", "No translate entry value");
}
break;
}
}
}
}
});
}
因此,我想要的是在单击 AIButton 时停止所有正在运行的 AsyncTask,以便停止先前的任务以执行新任务。如何做到这一点?
这里的问题是您不能在此处执行类似以下操作:listenButton.onClickListener()
。
最佳答案
使用boolean cancel (boolean mayInterruptIfRunning) .
将 asyncTask 设为类变量。
AsyncTask translate_ = new translate();
然后原地这样调用。
translate_.execute(textToTranslate.getText().toString(), "az");
在按钮 onclick 中取消 asyncTask。
translate_.cancel(true);
然后在循环中检查任务是否已取消并设置中断。
for (int i=0; i<translatedTextObj.length(); i++) {
translatedText = translatedTextObj.getString(i);
Log.d("translatedText", translatedText);
if(isCancelled())
break;
}
这些问题还为如何选择执行此操作提供了更多多样性:
Android - Cancel AsyncTask Forcefully
How to stop asynctask thread in android?
在 backpress 上管理任务也是明智的。也许在暂停时取消 Activity 中的任务。
public void listenButtonOnClick(final View view) {
// aiService.startListening();
// add more details in here
if (aiService != null) {
switch (currentState) {
case normal:
aiService.startListening();
break;
case busy:
aiService.cancel();
translate_.cancel(true);
break;
default:
aiService.stopListening();
translate_.cancel(true);
break;
}
或者在aiservice
被取消或停止时取消任务。
@Override
public void onListeningStarted() {}
@Override
public void onListeningCanceled() {
translate_.cancel(true);
}
@Override
public void onListeningFinished() {
translate_.cancel(true);
}
还有其他管理方式,探索您的选择。好好看看at this以及上面链接的 SO 问题。
如果你看看the docs .
apiai-android-client/ailib/src/main/java/ai/api/ui/AIButton.java
@Override
protected void onClick(final View v) {
super.onClick(v);
if (aiService != null) {
switch (currentState) {
case normal:
aiService.startListening();
break;
case busy:
aiService.cancel();
break;
default:
aiService.stopListening();
break;
}
}
}
从our discussion就清楚了你正在为如何实现这个而苦苦挣扎。
请研究这个apiai-android-client/ Android SDK for api.ai/ Tutorial
回到基础。暂时忘记 ai.api
并学习基础知识。 Browse周围,阅读文档 Input Events阅读问题并应用编程原则。
例如:
Android button onclick override
除此之外,我无法为您提供更多帮助。
关于android - API.AI : How to stop AsyncTask on click of the AIButton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107516/