IntentService зависает при вызове HttpUrlConnection.getResponseCode () - PullRequest
0 голосов
/ 31 января 2019

Мне нужно отправить асинхронные данные в API, и я использую IntentService.При звонке con.getResponseCode().

зависает. ВСЕГДА не зависает. Сначала я отправлял запросы на сервер без проблем.В определенный момент он начал замерзать.С тех пор он зависает каждый раз, как будто он ждет ответа, но он никогда не приходит.

Это для Android API от 19 и выше (я на самом деле работаю на API 24 в любом случае).

Iраньше использовали этот код в AsyncTask, и он работал (разделенный на doInBackground() и onPostExecute()).На этот раз мне нужно что-то, что может работать в фоновом режиме, даже когда приложение закрыто, поэтому AsyncTask исключен.

Я публикую код внутри onHandleIntent класса MyIntentService, который расширяет IntentService.

Насчет API, который я сделал для этого, он работает нормально, я уже тестировал его.

РЕДАКТИРОВАТЬ: я пытался с JobIntentService, но он все равно не работает.Я конечно что-то упускаю, но я не понимаю, что.

    String ret = "";
    HttpURLConnection con = null;
    DbManager db = new DbManager(getApplicationContext());

    try{

        SharedPreferences pref = 
        getApplicationContext().getSharedPreferences("MyPref", 0); 

        String URL_STRING = pref.getString("STORED_URL_FOR_REST_SERVICE", 
        null) + "/api/values/7";
        URL Url = new URL (URL_STRING);

        con = (HttpURLConnection) Url.openConnection();
        con.setRequestProperty("Connection", "Keep-Alive");
        con.setRequestProperty("json_input", db.getJsonToSend());
        con.setRequestMethod("POST");
        //con.setDoInput(true);
        //con.setDoOutput(true);
        con.setUseCaches(false);

        int responseCode = con.getResponseCode();

        if (responseCode == 200 || responseCode == 201 ) {

            BufferedReader br = new BufferedReader(new 
            InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;

            while ((line = br.readLine()) != null) {
                sb.append(line+"\n");
            }
            br.close();

            ret = sb.toString();

        } else {

            ret = "ERRORE: " + Integer.toString(con.getResponseCode());

        }

    }catch(Exception e){

        ret = "ERRORE: " + e.getMessage();

    }
    finally {

        if(con != null) {
            con.disconnect();
        }

    }


    if(ret.contains("ERRORE")){

        Toast.makeText(getApplicationContext(), "Errore nell'invio dei 
        dati\nNuovo tentativo a breve", Toast.LENGTH_SHORT).show();

    }else{
        Gson gson = null;
        Rest1 r2 = null;

        try {
            gson = new Gson();
            r2 = gson.fromJson(ret, Rest1.class);
            db = new DbManager(getApplicationContext());
        }catch(Exception e){
            Toast.makeText(this, e.getMessage(), 
            Toast.LENGTH_SHORT).show();
        }

        try {
            db.setRowToSent(r2.getResult().split("#"));
        }catch(Exception e){
            Toast.makeText(this, e.getMessage(), 
            Toast.LENGTH_SHORT).show();
        }
        if (r2.getMessage().equals("OK")) {


        } else if (r2.getMessage().equals("KO")) {

            Toast.makeText(getApplicationContext(), "Errore nell'invio dei 
            dati\nNuovo tentativo a breve", 
            Toast.LENGTH_SHORT).show();

        }
    }
...