Приложение Android отстает при подключении по URL-адресу HTTP - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь отправить HTTP-запрос каждый раз, когда кто-то нажимает на кнопку «Отправить» в приложении чата Firebase. Этот запрос не связан с Firebase. Но важно для какой-то функциональности в нем.

Каждый раз, когда я нажимаю кнопку отправки, мое приложение немного отстает. Кроме того, каждый раз, когда я вызываю функцию Firebase, прежде чем отправить этот http-запрос, мое приложение полностью зависает ...

Вызов только Firebase очень плавный ...

Я также хочу отправить набор текстасигнал через http соединение с другим сервером. Но из-за этой задержки это почти невозможно ...

Это мой код,

   public static String post(URL url, String data) throws IOException {
        StringBuilder out = new StringBuilder();
        final CountDownLatch latch = new CountDownLatch(1);

        Thread httpThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestProperty("User-Agent", userAgent);
                    conn.setDoOutput(true);

                    OutputStreamWriter writer = new OutputStreamWriter(
                            conn.getOutputStream());
                    writer.write(data);
                    writer.flush();


                    String line;

                    BufferedReader input = new BufferedReader(new InputStreamReader(
                            conn.getInputStream()));
                    try {
                        while ((line = input.readLine()) != null) {
                            out.append(line).append("\n");
                        }
                    } finally {
                        input.close();
                    }
                    latch.countDown();

                } catch (Exception e) {

                }


            }

        });
        httpThread.start();
        try {
            latch.await();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Sending Output : "+out);
        return out.toString().trim();


    }

Также я пробовал тестировать с определенным классом AsyncTask , но я 'Я получаю ту же задержку или проблему замораживания. Что я делаю неправильно? (

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Вы используете поток HTTP, но, в конце концов, вы ожидаете завершения потока внутри вашего основного потока пользовательского интерфейса, который блокирует и задерживает приложение.

Вы можете использовать androidБиблиотека -async-http, предназначенная для отправки асинхронных (неблокирующих) запросов:

https://loopj.com/android-async-http/

Добавьте эту строку в файл сборки Gradle:

implementation 'com.loopj.android:android-async-http:1.4.9'

Пример использования:

import com.loopj.android.http.*;

AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
1 голос
/ 04 октября 2019

Можете ли вы попробовать добавить usesCleartextTraffic в AndroidManifest.xml файл

<application
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">
    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
</application>
...