Выполнение HTTP-вызова с использованием Workmanager всякий раз, когда происходит событие, вызывает исключение в первый раз, когда приложение закрывается - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать рабочий менеджер, поставленный в очередь из широковещательного приемника, для выполнения HTTP-запроса в фоновом режиме. При успешной отправке уведомления. Также отправка уведомления в блоке catch. Я впервые получаю уведомление из блока catch с java.net.Connect.Exception и иногда с java.net.SocketTimeoutException.

Хотелось бы узнать, почему я получаю исключение в первый разтолько и как я могу решить это. Это я видел в производстве устройств, принадлежащих Xiaomi, Oneplus, Oppo (версия Pie). Был бы признателен, если бы кто-нибудь помог мне.

Использование HttpsURLConnection для http-вызова.

 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setReadTimeout(60000);
                conn.setConnectTimeout(60000);
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);

                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("notificationData", notificationData)
                        .appendQueryParameter("date", currentDate)
                        .appendQueryParameter("deviceId", "note 6 pro");
                String query = builder.build().getEncodedQuery();
                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();

                conn.connect();
                /* Get Response and execute WebService request*/
                int statusCode = conn.getResponseCode();
                /* 200 represents HTTP OK */
                if (statusCode == HttpsURLConnection.HTTP_OK) {
                    // Read the input stream into a String
                    InputStream inputStream = conn.getInputStream();
                    StringBuffer buffer = new StringBuffer();
                    if (inputStream == null) {
                        // Nothing to do.
                        return null;
                    }

                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line + "\n");
                    }

                    if (buffer.length() == 0) {
                        return null;
                    }

                    return buffer.toString();

                }
            } catch (IOException e) {
                e.printStackTrace();
                showNotification(getApplicationContext(), "in server call catch", e+" "+notificationData);
            }
...