【问题标题】:How do I put the translation api code to AsyncTask?如何将翻译 api 代码放入 AsyncTask?
【发布时间】:2019-01-08 14:36:43
【问题描述】:

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

这是我项目中的代码,我收到错误 android.os.NetworkOnMainThreadException。我找到的解决方案是将其置于异步状态。

我尝试在互联网上搜索,甚至询问论坛,我找不到将这段代码放入 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。在此先感谢:)

【问题讨论】:

  • 你有很多可能的解决方案;最常见的是使用AsyncTask

标签: java android-studio android-asynctask


【解决方案1】:

使用异步任务

您可以使用AsyncTask。它有3个步骤。

1. onPreExecute() - 在运行 doInBackground() 之前您想要做的事情。这发生在 UI 主线程中。

2. doInBackground()- AsyncTask,将在后台线程中进行操作(后台线程由Android创建,因此您无需担心它)。

3.onPostExecute() - 在这里您可以接收来自 doInBackground 方法的任何数据。 postExecute 方法在 UI 主线程中再次执行。

因此您可以在doInBackground() 中进行任何 I/O 操作,并返回您从服务器或任何其他数据源接收到的值。

如何申报

要使用AsyncTask,需要扩展Android AsyncTask

所以您自己的 AsyncTask 声明将如下所示:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { ... }

你问的 3 个通用参数是什么?

1. Params - 执行时发送给任务的参数类型。

2. Progress - 在后台计算期间发布的进度单元的类型。 (几乎总是Void,除非您关心操作的实际进度。注意这是Void,带有大写字母,不是 void 作为返回类型)。

3. Result - 后台计算结果的类型。

完整示例

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,在onPostExecute()方法中接收到sameString(记住,onPostExecute()在UI主线程上运行再次)。因此,您可以使用从长阻塞操作中收到的字符串值更改您的 UI。

如果你想要文档,这里是:

https://developer.android.com/reference/android/os/AsyncTask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多