У меня возникает ошибка 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("");
}
}