Как оптимизировать получение данных из mysql через php / android?

Вступление

У меня есть приложение, и я хочу заставить пользователя обновить его, если на 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;
}
}
}

7

Решение

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

Вам нужно использовать setConnectTimeout а также setReadTimeout

setConnectTimeout

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

setReadTimeout

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

ОБРАЗЕЦ КОДА

   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";
}
}
}

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

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

ОТ ДОКУМЕНТОВ

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

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

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

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

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

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

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

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

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

Дооснащение против волейбола

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]