Как поместить код API перевода в AsyncTask? - PullRequest
0 голосов
/ 08 января 2019

Я работаю над речью к тексту с переводом. То, что я хочу сделать, это когда пользователь вводит свой голос, будет автоматический перевод, основанный на том, что он выбран в счетчике.

Это код из моего проекта, я получаю сообщение об ошибке android.os.NetworkOnMainThreadException. И решение, которое я нашел, состояло в том, чтобы поместить это в асинхронное.

Я пытался искать в интернете и даже спрашивал на форумах, я не могу найти решение, чтобы поместить этот код в асинхронную задачу. Это код, который я хочу поместить в async.

@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 голосов
/ 08 января 2019

Использование AsyncTask

Вы можете использовать AsyncTask. У этого есть 3 шага к этому.

1. onPreExecute() - что вы хотите сделать перед запуском doInBackground(). Это происходит в основном потоке пользовательского интерфейса .

2. doInBackground() - AsyncTask будет выполнять операции в фоновом потоке (фоновый поток создается Android, поэтому вам не нужно об этом беспокоиться) .

3. onPostExecute() - здесь вы можете получить любые данные из метода doInBackground. Метод postExecute выполняется снова в основном потоке пользовательского интерфейса .

Таким образом, вы можете выполнять любые операции ввода-вывода в doInBackground() и возвращать значение, полученное с сервера или любого другого источника данных.

Как объявить

Чтобы использовать 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); 
        }
    }

В этом примере я создаю поддельную длинную операцию, которую вы не можете запустить в основном потоке пользовательского интерфейса (поскольку это блокирующая операция).

Когда операция завершается, она возвращает String, и то же самое String получено в методе onPostExecute() (и помните, onPostExecute() снова запускается в главном потоке пользовательского интерфейса ). Таким образом, вы можете изменить свой пользовательский интерфейс со значением String, которое вы получили от длинной блокирующей операции.

Если вам нужна документация, вот она:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...