Android: HttpURLConnection занимает очень много времени, чтобы получить ответ при запуске обнаружения Bluetooth - PullRequest
0 голосов
/ 17 февраля 2012

Я разрабатываю приложение, которое подключается к рейтинговому серверу, чтобы получить текущий рейтинг.

Для этого я использую класс HttpURLConnection. Моя проблема в том, что я получаю очень большое время соединения, хотя я подключен через WiFi. Иногда соединение также отказывается. Тогда я больше не связан с WiFi роутером. Сервер быстрый и имеет хорошее сетевое соединение и задержку. В целях тестирования я рассчитал время между каждой частью.

Вот код:

        //The code runs in the doInBackground(String... params) method

        long randStartTime = System.currentTimeMillis();

        do
        {
            Random randomGenerator = new Random();
            randomgen = randomGenerator.nextInt(10);
        }while(randomgen == 0);

        int random = //Calculation of the Session_ID
        String res = null;

        long randEndTime = System.currentTimeMillis();
        Log.d("RandEXETime", String.valueOf(randEndTime - randStartTime));

        HttpURLConnection connection = null;


        try {        

            long URLStartTime = System.currentTimeMillis();


            String[] paramsList = params[0].split("\n");
            Log.d("SMBD_AsyncTask_params", paramsList[0] + "|" + paramsList[1] + "|" + paramsList[2] + "|" + paramsList[3]);
            Integer idList = Integer.decode(paramsList[0]);

            String request;

            if(idList == 0) {
                request = "http://maks.mph-p.de/blue/checkrankv12.php?device_number=" + paramsList[3] + "&session_id=" + random;
            }else{

                Log.d("SMBD ID", idList.toString());
                request = "http://maks.mph-p.de/blue/checkrankv12.php?read=1&id=" + idList + "&device_number=" + paramsList[3] + "&session_id=" + random;

            }

            String urlParameters = "adress=" + URLEncoder.encode(paramsList[1], "UTF-8") + "&name=" + URLEncoder.encode(paramsList[2], "UTF-8");

            URL url = new URL(request); 

            long URLEndTime = System.currentTimeMillis();           
            Log.d("URLEXETime", String.valueOf(URLEndTime - URLStartTime));



            long RequestStartTime = System.currentTimeMillis();

            connection = (HttpURLConnection) url.openConnection();           
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setInstanceFollowRedirects(false); 
            connection.setRequestMethod("POST"); 
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
            connection.setRequestProperty("charset", "utf-8");
            connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
            connection.setUseCaches (false);

            DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
            wr.writeBytes(urlParameters);
            wr.flush();
            wr.close();

            long RequestEndTime = System.currentTimeMillis();           
            Log.d("RequestEXETime", String.valueOf(RequestEndTime - RequestStartTime));

            Log.d("SMBD_AsynkTask", "After sending");

            long ResponseStartTime = System.currentTimeMillis();


                InputStream in = new BufferedInputStream(connection.getInputStream());

            long ResponseEndTime = System.currentTimeMillis();              
            Log.d("ResponseEXETime", String.valueOf(ResponseEndTime - ResponseStartTime));

            long ResponseINStartTime = System.currentTimeMillis();

                res = inputStreamToString(in);

                long ResponseINEndTime = System.currentTimeMillis();            
                Log.d("ResponseINEXETime", String.valueOf(ResponseINEndTime - ResponseINStartTime));    


            Log.d("SMBD_AsynkTask_response", res);

            //}
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block

            res = "false";
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block

            res = "false";
        }catch (IOException e2) {
            // TODO Auto-generated catch block

            res = "false";
        }finally{
            connection.disconnect();
        }




        String result = res;
        return result;

Когда я подключаюсь к WiFi и переподключаюсь к нему, запускаю приложение, время подключения выглядит так:

02-17 15:21:27.800: D/RandEXETime(6008): 0
02-17 15:21:27.800: D/SMBD_AsyncTask_params(6008): 4454|C8:AA:21:F1:C0:BA|Maksl5|57
02-17 15:21:27.800: D/SMBD ID(6008): 4454
02-17 15:21:27.800: D/URLEXETime(6008): 1
02-17 15:21:27.870: D/RequestEXETime(6008): 68
02-17 15:21:27.870: D/SMBD_AsynkTask(6008): After sending
02-17 15:21:27.950: D/ResponseEXETime(6008): 76
02-17 15:21:27.950: D/ResponseINEXETime(6008): 1
02-17 15:21:27.950: D/SMBD_AsynkTask_response(6008): 101. / 2171

Но когда я закрываю приложение и открываю его снова, время соединения слишком велико:

02-17 15:06:36.220: D/RandEXETime(5575): 0
02-17 15:06:36.220: D/SMBD_AsyncTask_params(5575): 4454|C8:AA:21:F1:C0:BA|Maksl5|56
02-17 15:06:36.220: D/SMBD ID(5575): 4454
02-17 15:06:36.220: D/URLEXETime(5575): 2
02-17 15:06:39.300: D/RequestEXETime(5575): 3070
02-17 15:06:39.300: D/SMBD_AsynkTask(5575): After sending
02-17 15:06:45.490: D/dalvikvm(5575): GC_CONCURRENT freed 192K, 4% free 6755K/6983K, paused 2ms+2ms
02-17 15:07:09.130: D/ResponseEXETime(5575): 29830
02-17 15:21:56.430: D/ResponseINEXETime(6008): 1
02-17 15:07:09.130: D/SMBD_AsynkTask_response(5575): 102. / 2171

Итак, мой вопрос: почему ответ занимает 30 секунд только для 11 символов? Проблема также возникает, когда планшет находится на 5 см рядом с WiFi роутером.

Проблема не возникает в других приложениях, только в этом приложении.

Не могу проверить через 3G.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 07 апреля 2012

Хорошо, я знаю проблему.

После долгих поисков я нашел несколько интересных вещей.

Если ваше устройство подключено к WiFi и в настоящее время обнаруживает устройства Bluetooth, между сигналами возникает много помех! В случае, когда WiFi и Bluetooth извлекают или отправляют данные, сигнал Bluetooth мешает работе WiFi, поэтому сигнал WiFi падает или длится ненормально долго. Поэтому убедитесь, что если вы хотите получить данные из сети Wi-Fi, не выполняется ни обнаружение Bluetooth, ни передача.

Чтобы проверить, подключен ли WiFi, вы можете взять этот код:

    boolean IsConnectedToWifi = false;

    ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInf = conMgr.getAllNetworkInfo();
    for(NetworkInfo inf : netInf){
        if(inf.getTypeName().contains("WIFI"))
        {
            if(inf.isConnected()){
                IsConnectedToWifi = true;
            }   

        }
    }

Затем в методе onPreExecute () в AsyncTask вы должны проверить, подключено ли к WiFi, и отменить текущее обнаружение с помощью

.
BluetoothAdapter.cancelDiscovery();
...