0ralo
@0ralo
Python backend developer

Как получить данные не останавливая поток?

Здравствуйте! Попал в тупик: У меня есть приложение которое, при старте, и\или при команде юзера делает запрос на сервер(GET). Во время запроса приложение не отвечает несколько секунд( даже при том что сервер в локалке). В гугле нашел решение - AsyncTask, теперь запрос делается рядом в основном потоке, не мешая ему. Однако мне нужно обработать ответ сервера, для этого я вызываю метод get(), который , внимание, блокирует поток, и теряется вся суть использования AsyncTask. Вопрос: как асинхронно получить ответ с сервера без фризов ui потока?
server.java
package com.oralo.server_notepad;

import android.os.AsyncTask;
import android.util.Log;

import androidx.core.util.Consumer;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;

class NotepadServer extends AsyncTask<String, Void, String> {
    private static String API;
    private static String TAG = "NOTEPAD_LOG";
    public NotepadServer(String api){
        API = api;
    }

    @Override
    protected String doInBackground(String... method) {
        try {
            URL url = new URL(API + method[0]);
            System.out.println(Arrays.toString(method));
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("Accept-Encoding", "identity");
            con.setRequestProperty("secret", "1001");
            try (final BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
                String inputLine;
                final StringBuilder content = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                return content.toString();
                }
            } catch (final Exception ex) {
                ex.printStackTrace();
            }
        return "404";
    }
}
Использую тут
sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                server = new NotepadServer(API);
                server.execute("add?login=" + login + "&password=" + password + "&body=" + editText.getText().toString());
                editText.setText("");
                try {
                    Log.i("server:response", server.get());//тут поток останавливается и ждет ответа
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@szanislo
Пример AsyncTask
Думаю вам нужен метод onPostExecute
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы