Новичок в okhttp3, понятия не имею, почему он не будет показывать результаты в TextView

#java #android #okhttp

Вопрос:

 import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.OkHttpClient;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        final TextView textView = findViewById(R.id.text_view_id);
        final String IMAGE1 = "storage/emulated/0/Download/image_1.jpeg";
        File file1 = new File(IMAGE1);
        try {
            final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("images", "image_1.jpeg",
                            RequestBody.create(file1, MEDIA_TYPE_JPEG))
                    .addFormDataPart("organs", "flower")
                    .build();
            Request request = new Request.Builder()
                    .url("https://my-api.plantnet.org/v2/identify/all?api-key=123")
                    .post(requestBody)
                    .build();
            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            textView.setText(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

Я понимаю, что я пытаюсь запустить сетевую активность здесь, в основном потоке. Вот почему я включил разрешающий режим StrictMode, чтобы обойти проблему (я видел ответ на аналогичную тему, в котором предлагалось это сделать). Я пытаюсь использовать PlantNet API здесь, и я использую свой телефон для тестирования. Тот же телефон, на котором сохранено изображение.

Комментарии:

1. «Вот почему я включил разрешающую функцию StrictMode, чтобы обойти проблему (я видел ответ на аналогичную тему, в котором предлагалось это сделать)» — это не очень хорошая идея. Это особенно верно, поскольку вы используете OkHttp, который имеет встроенный асинхронный HTTP-запрос API . Кроме того, проверьте Logcat на наличие трассировки стека, поступающей из вашего кода, поскольку, по-видимому, ваш код вызывает исключение, которое вы регистрируете там. Это может быть из-за отсутствия INTERNET разрешения или проблемы с доступом к файлам.

2. возможно, это так, я не добавил разрешение на доступ к файлам.

Ответ №1:

перейдите к обновлению

это обеспечивает приятный и простой способ сделать ваши сетевые вызовы вне основного потока