Как оптимизировать получение данных из mysql через php / android? - PullRequest
0 голосов
/ 13 ноября 2018

Введение

У меня есть приложение, и я хочу заставить пользователя обновить его, если на Google Play Market появилась новая версия.Это работает нормально со следующим кодом, но не очень стабильно.Я делаю это через AsyncTask и получаю данные из файла php.Но это дает мне ощущение, что должен быть лучший способ или способ, который делает его гораздо более стабильным.

Вопрос

Как установить тайм-аут напроцедура, например, из-за очень низкого интернет-соединения от пользователя?

Код

get_newest_apk.php

<?PHP

    /*  GET APK VERSION FROM ANDROID DEVICE
        Example: [PATH]/get_newest_apk.php?apkversion=6
    */
    if($_GET["apkversion"]){
        $apkversion= $_GET["apkversion"];

        //MYSQL LOGIN PARAMETERS
        $host = '*****';
        $user = '*****';
        $pass = '*****';
        $db =   '*****';

        $mysqli = new mysqli($host, $user, $pass, $db);

            $result = $mysqli->query("SELECT MAX(VERSION) FROM TBL_APK");
            $row = $result->fetch_row();
            $count = $row[0];

            if($count > $apkversion){
                //Newer APK is avaiable
                echo "1";
            }else{
                //There is no never APK avaiable
                echo "2";
            }

    }else{
        //Error by GETTING apkversion from Android device
        echo "3";
    }
?>

AsyncTask Class

class checkForNewAPK extends AsyncTask<Void, Void, String> {
    @Override
    protected void onPreExecute() {
        //Do not show the user a progress because he don't want to see it in every onResume
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        int intResult = Integer.parseInt(s);

        //strResult as intResult; 1 = Newer APK avaiable, 2 = No newer APK avaiable, 3 = Error at $_GET["apkversion"] line 6
        if(intResult == 1){
            //Force to Update App
            Log.v("APKResult: ", "1");
        }else if(intResult == 2){
            //No update needed
            Log.v("APKResult: ", "2");
        }else if(intResult == 3){
            //Error in PHP-File
            Log.v("APKResult: ", "3");
        }else{
            //Unknown error
            Log.v("APKResult: ", "Unkown Error");
        }
    }

    //in this method we are fetching the json string
    @Override
    protected String doInBackground(Void... voids) {
        try {
            int intApkVersion = getApplication().getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
            URL url = new URL(strUrlGetNewestAPK+"?apkversion="+intApkVersion);
            String strResultFromEcho;

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            StringBuilder strResult = new StringBuilder();

            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while ((strResultFromEcho = bufferedReader.readLine()) != null) {
                strResult.append(strResultFromEcho + "\n");
            }

            return strResult.toString().trim();
        } catch (Exception e) {
            return null;
        }
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

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

Вам необходимо использовать setConnectTimeout и setReadTimeout

setConnectTimeout

  • Устанавливает заданное значение времени ожидания в миллисекундах, которое будет использоваться при открытии канала связи с ресурсом, на который ссылается этот URLConnection.Если время ожидания истекает до того, как соединение может быть установлено, возникает исключение java.net.SocketTimeoutException.Нулевое время ожидания интерпретируется как бесконечное время ожидания.

setReadTimeout

  • Устанавливает время чтения дляуказанное время ожидания в миллисекундах.Ненулевое значение указывает время ожидания при чтении из входного потока, когда установлено соединение с ресурсом.Если время ожидания истекает до того, как появятся данные, доступные для чтения, java.net.SocketTimeoutException повышается.Нулевой тайм-аут интерпретируется как бесконечный тайм-аут.

SAMPLE CODE

   HttpURLConnection con = (HttpURLConnection) url.openConnection();
   con.setConnectTimeout(3000); //set connection time out in milliseconds
   con.setReadTimeout(3000); // set read time out in milliseconds

Внесите следующие изменения в свой код

class checkForNewAPK extends AsyncTask<Void, Void, String> {
    @Override
    protected void onPreExecute() {
        //Do not show the user a progress because he don't want to see it in every onResume
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        int intResult = Integer.parseInt(s);

        //strResult as intResult; 1 = Newer APK avaiable, 2 = No newer APK avaiable, 3 = Error at $_GET["apkversion"] line 6
        if(intResult == 1){
            //Force to Update App
            Log.v("APKResult: ", "1");
        }else if(intResult == 2){
            //No update needed
            Log.v("APKResult: ", "2");
        }else if(intResult == 3){
            //Error in PHP-File
            Log.v("APKResult: ", "3");
        }else{
            //Unknown error
            Log.v("APKResult: ", "Unkown Error");
        }
    }

    //in this method we are fetching the json string
    @Override
    protected String doInBackground(Void... voids) {
        try {
            int intApkVersion = getApplication().getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
            URL url = new URL(strUrlGetNewestAPK+"?apkversion="+intApkVersion);
            String strResultFromEcho;

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setConnectTimeout(3000); //set connection time outt in milliseconds
            con.setReadTimeout(3000); // set read time outt in milliseconds

            StringBuilder strResult = new StringBuilder();

            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while ((strResultFromEcho = bufferedReader.readLine()) != null) {
                strResult.append(strResultFromEcho + "\n");
            }

            return strResult.toString().trim();
        } catch (SocketTimeoutException e) {
            // this block code execute when time out exception is occur
            // you need to perform your logic here when time out exception occur
            return "Request timeout occur.\nTap on \'TRY AGAIN\' to retry";
        }
    }
}

Примечание: Вы также можете использовать библиотеку для вызова API

Вы можете использовать Volley библиотека

  • Volley - это библиотека HTTP, которая упрощает и ускоряет работу в сети для приложений Android.Залп доступен на GitHub .

ОТ DOCS

Залп предлагает следующие преимущества:

  • Автоматическое планирование сетевых запросов.

  • Несколько одновременных сетевых подключений.

  • Прозрачное кэширование ответов дисков и памяти со стандартной когерентностью HTTP-кэша.Поддержка приоритизации запросов.

  • API запроса отмены.Вы можете отменить один запрос или установить блоки или объемы запросов для отмены.

  • Простота настройки, например, для повторных попыток и отката.

  • Строгий порядок, упрощающий правильное заполнение вашего пользовательского интерфейса данными, извлекаемыми асинхронно из сети.

  • Инструменты отладки и трассировки.

Вы можете использовать Retrofit библиотека

  • Типобезопасный HTTP-клиент для Android и Java от Square, Inc. Retrofit Github link

Retrofit vs Volley

Пожалуйста, прочитайте этот пост Сравнение сетевых библиотек Android: OkHTTP, Retrofitи залп

...