3

我正在开发一个检查是否有可用更新的应用程序。问题是我的应用程序无法识别自己处于最新版本。

我的服务器上有一个文件,该文件包含最新的版本号 (1.0.1)。我的应用程序版本也是 1.0.1,但是当我检查更新时,我的应用程序表明有更新可用,文本显示最新且安装的版本是 1.0.1。

所以这是我的代码:

(checkupdatebutton)
{
    setContentView(R.layout.updater);


    DefaultHttpClient httpclient = new DefaultHttpClient();

    try {
        HttpGet httppost = new HttpGet("http://myserver.com/latestversion.txt");
        HttpResponse response;
        response = httpclient.execute(httppost);
        HttpEntity ht = response.getEntity();
        BufferedHttpEntity buf = new BufferedHttpEntity(ht);
        InputStream is = buf.getContent();
        BufferedReader r = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line + "\n");
            }
            TextView versionupdnew = (TextView)findViewById(R.id.versionupdnew);
            //Set text to value of my file (latestversion.txt)
            versionupdnew.setText(total);

            TextView installedversion = (TextView)findViewById(R.id.versionupdcur);
            installedversion.setText(R.string.version);

            TextView title = (TextView)findViewById(R.id.title);
            if(installedversion.equals(versionupdnew))
            {
            //Current version is latest
        title.setText("No update needed!");
            Button buttonUpdate = (Button)findViewById(R.id.buttonUpdate);
            buttonUpdate.setEnabled(false);
            }else{
              title.setText("New version is available!");
            }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
    }
}
4

3 回答 3

2

TextView.equals()当两个框的文本值相等时不返回 true。您需要比较两个框的文本值。

例如:

if(installedversion.getText().toString().equals(versionupdnew.getText().toString()))

请注意,该TextView.getText()函数不返回 a StringAPI 文档声明它返回 a CharSequence,但是如果它设置为使用SpannableEditable可以转换为不同的类型。toString()在这些类型上使用将框的文本值返回为 aString和 in我的经验是比较两个Views值的最可靠方法)

于 2013-06-29T19:08:27.437 回答
2

使用 SharedPreferences 存储最新版本,否则使用 R.string.version 将始终检查安装的 apk 附带的版本,并且当下载新版本时,它不会更新它。

如果您将版本映射到整数,那将是最简单的,这样您就不需要解析版本​​字符串。每个新版本都将比上一个版本大 1。

  1. 获取当前版本:

    // use preferences to get the current version, with default = 1 
    // (replace 1 with the version that came with the apk)
    preferences.getInt("current_version", 1); 
    
  2. 从您的服务器获取版本。

  3. 检查服务器版本是否大于当前版本,并在必要时更新:

    if (server_version > current_version) {
       update();
       preferences_editor.putInt("current_version", server_version).commit();
    }
    
  4. 现在,下次您检查是否需要更新时,您将检查最近更新的版本。

于 2013-06-29T19:21:47.100 回答
0

For you current problem, you are comparing TextViews rather than strings, so comparing strings will help.

Though I will really suggest you alternative approach,

-You can setup a small API on server say "check_version"

-You will pass the current version number to API like:"www.myServer.com/check_version.php?v=1.0.1"

-The API will return some JSON saying

{
   status:"UPDATE_AVAILABLE",
   message: "An update is available",
   url: "http://play.google.com?xxxyyyzzz"
}

Here you can use the "status" field to determine if update is available.. it can also inform if update is critical or not.. like you can have possible values

  • "UPDATE_AVAILABLE"

  • "UPDATE_REQUIRED"

  • "LATEST".

    While message and URL can be blank if its "LATEST". All comparison logic will be on server.

于 2013-06-29T19:38:53.337 回答