【问题标题】:How to optimize getting data from mysql via php / android?如何优化通过 php / android 从 mysql 获取数据?
【发布时间】:2019-04-16 02:44:32
【问题描述】:

简介

如果 google play 市场上有新版本,我有一个应用程序并希望强制用户更新它。这适用于以下代码,但不是很稳定。 我正在通过 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 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;
        }
    }
}

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。问题目前有被近距离投票为Too Broad的风险
  • 我确实编辑了这个问题。谢谢!

标签: php android mysql httpurlconnection stringbuilder


【解决方案1】:

如何设置程序超时,例如由于用户的互联网连接非常低?

你需要使用setConnectTimeoutsetReadTimeout

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

注意:您也可以使用库进行 API 调用

你可以使用Volley

  • Volley 是一个 HTTP 库,它使 Android 应用程序的网络变得更容易,最重要的是,更快。 Volley 可通过GitHub 获得。

来自文档

Volley 提供以下好处:

  • 自动调度网络请求。

  • 多个并发网络连接。

  • 具有标准 HTTP 缓存一致性的透明磁盘和内存响应缓存。 支持请求优先级。

  • 取消请求 API。您可以取消单个请求,也可以设置要取消的请求块或范围。

  • 易于自定义,例如重试和退避。

  • 强排序,可以轻松地使用从网络异步获取的数据正确填充您的 UI。

  • 调试和跟踪工具。

你可以使用Retrofit

改装与排球

请阅读这篇文章Comparison of Android networking libraries: OkHTTP, Retrofit, and Volley

【讨论】:

  • 除了这篇文章之外,我的问题是,我正在使用 Magento 1.9 soap v2 api,我得到的值就像对象一样,我如何将其转换为用于 Android 应用程序开发的 xml。我的代码:justpaste.it/43kpl 谢谢。 @Nilesh Rathod
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多