如何将翻译api代码放入AsyncTask?

时间:2019-01-08 14:36:44

标签: java android-studio android-asynctask

我正在努力将语音翻译成文本。我想做的是,当用户输入他/她的声音时,将根据微调器中的选择进行自动翻译。

这是我项目中的代码,我收到错误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。在此先感谢:)

1 个答案:

答案 0 :(得分:0)

使用AsyncTask

您可以使用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