NetworkOnMainThreadException: запускать сетевые операции в потоке или как асинхронную задачу - PullRequest
0 голосов
/ 21 апреля 2020

У меня возникает ошибка NetworkOnMainThreadException при android .os.StrictMode $ AndroidBlockGuardPolicy.onNetwork при попытке использовать API. Я использую API для анализа текста на предмет эмоций.

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

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

public class Main2Activity extends AppCompatActivity {

    private TextView textmain1, textmain2;
    private EditText editText;
    private Button submitBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        textmain1 = (TextView) findViewById(R.id.textmain1);
        textmain2 = (TextView) findViewById(R.id.textmain2);
        editText = (EditText) findViewById(R.id.edittext);
        submitBtn = (Button) findViewById(R.id.submitBtn);

        submitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                analyze();
            }
        });
    }

    private void analyze() {
        String userInputText = editText.getText().toString();

        try {
            List<ToneScore> documentTones = new ArrayList<>();
            List<SentenceAnalysis> sentenceDetectedTones = new ArrayList<>();

            IamAuthenticator authenticator = new IamAuthenticator(authenticator);
            ToneAnalyzer toneAnalyzer = new ToneAnalyzer("2020-02-22", authenticator);
            toneAnalyzer.setServiceUrl(url);
            ToneOptions toneOptions = new ToneOptions.Builder().text(userInputText).build();
            ToneAnalysis toneAnalysis = toneAnalyzer.tone(toneOptions).execute().getResult();

            documentTones = toneAnalysis.getDocumentTone().getTones();

            if (documentTones == null || documentTones.isEmpty()) {
                textmain1.setText("No tones are detected :(");
            } else {
                StringBuilder detectedTones = new StringBuilder();
                for (ToneScore score : documentTones) {
                    if (score.getScore() > 0.5f) {
                        detectedTones.append(score.getToneName()).append(" \n").append(score.getScore()).append("\n\n");
                    }
                }
                textmain1.setText(detectedTones);
            }

            sentenceDetectedTones = toneAnalysis.getSentencesTone();

            if (sentenceDetectedTones == null || sentenceDetectedTones.isEmpty()) {
                textmain2.setText("Oops! No sentence analysis is available for this one");
            } else {
                StringBuilder sentenceTones = new StringBuilder();
                for (SentenceAnalysis sentenceAnalysis : sentenceDetectedTones) {

                    List<ToneScore> singleScoreBlock = sentenceAnalysis.getTones();

                    for (ToneScore toneScore : singleScoreBlock) {
                        if (toneScore.getScore() > 0.5) {
                            sentenceTones.append("\"").append(sentenceAnalysis.getText()).append("\"");
                            sentenceTones.append("\n").append(toneScore.getToneName()).append(": ").append(toneScore.getScore()).append("\n\n");
                        }
                    }
                }
                textmain2.setText(sentenceTones);
            }
        } catch (NotFoundException e) {
            // Handle Not Found (404) exception
            Toast.makeText(Main2Activity.this, e.getMessage(), Toast.LENGTH_LONG).show();
        } catch (RequestTooLargeException e) {
            // Handle Request Too Large (413) exception
        } catch (ServiceResponseException e) {
            // Base class for all exceptions caused by error responses from the service
            System.out.println("Service returned status code " + e.getStatusCode() + ": " + e.getMessage());
        } catch (ArrayIndexOutOfBoundsException | IllegalArgumentException e) {
            Toast.makeText(Main2Activity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        editText.setText("");
    }

}
...