我正在努力将语音翻译成文本。我想做的是,当用户输入他/她的声音时,将根据微调器中的选择进行自动翻译。
这是我项目中的代码,我收到错误android.os.NetworkOnMainThreadException。我发现的解决方案是将其置于异步状态。
我尝试在Internet上搜索,甚至在论坛上搜索,但找不到将此代码放入asynctask中的解决方案。这是我要放入异步代码。
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Translate translate = TranslateOptions.getDefaultInstance().getService();
TextView translatedText = view.findViewById(R.id.translatedText);
switch (position){
case 1:
Translation enTranslation = translate
.translate(translatedText
.getText()
.toString(), TranslateOption.sourceLanguage("en"), TranslateOption.targetLanguage("en"));
translatedText.setText(enTranslation.getTranslatedText());
break;
case 2:
Translation filTranslation = translate
.translate(translatedText
.getText()
.toString(), TranslateOption.sourceLanguage("en"), TranslateOption.targetLanguage("fil"));
translatedText.setText(filTranslation.getTranslatedText());
break;
case 3:
Translation cebTranslation = translate
.translate(translatedText
.getText()
.toString(), TranslateOption.sourceLanguage("en"), TranslateOption.targetLanguage("ceb"));
translatedText.setText(cebTranslation.getTranslatedText());
break;
}
}
我希望我不会收到android.os.NetworkOnMainThreadException。在此先感谢:)
答案 0 :(得分:0)
您可以使用AsyncTask
。它有3个步骤。
1。 onPreExecute()
-运行doInBackground()
之前要执行的操作。这发生在 UI主线程中。
2。 doInBackground()
-AsyncTask,将在后台线程中进行操作(后台线程是由Android创建的,因此您无需担心)。
3。 onPostExecute()
-在这里,您可以从doInBackground方法接收任何数据。在 UI主线程中再次执行postExecute方法。
因此,您可以在doInBackground()
中进行任何I / O操作,并返回从服务器或任何其他数据源收到的值。
要使用AsyncTask
,您需要扩展Android AsyncTask
。
因此您自己的AsyncTask声明将如下所示:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> { ... }
您要问的3个通用参数是什么?
1。 Params (参数)-执行时发送给任务的参数类型。
2。。进度-后台计算过程中发布的进度单位的类型。 (除非您关心操作的实际进度,否则几乎总是Void
。注意,这是Void
带有大写字母,不是 void
为返回类型)。
3。 结果-后台计算结果的类型。
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = findViewById(R.id.output);
txt.setText(result);
}
}
在该示例中,我创建了一个虚假的长时间操作,使您无法在UI主线程上运行(因为它是阻塞操作)。
操作完成后,它返回一个String
,并且在String
方法中收到了相同 onPostExecute()
(请记住,{{1 }}再次在UI主线程上运行)。因此,您可以使用从长时间阻塞操作中收到的String值来更改UI。
如果您需要文档,请在这里:
https://developer.android.com/reference/android/os/AsyncTask