检查服务器上的文件是否已更改而无需下载的简单方法

时间:2013-03-05 21:20:41

标签: android xml-parsing android-query

我有一个我在Android应用中解析的XML文件。如果文件没有被更改,我想不解析它。

我可以获得上次修改文件的时间,并且我可以从GMT中的服务器标题中获取最后修改日期,但我不确定现在该做什么...

    //this is a string: status.getHeader("last-modified"); 
    //Shows like so: Tue, 05 March 2013 16:45:02 GMT
    String serverlastmodified = status.getHeader("last-modified");    
    Log.e("Header",serverlastmodified);

    Date s = status.getTime();
    String filelastgotten = s.toGMTString();
    //String shows like so: 5 Mar 2013 19:41:43 GMT
    Log.e("LM", filelastgotten);

//this needs to be a great-than / less-than? 
//But I cannot do that to a string... so change to int?
    if(serverlastmodified.equals(filelastgotten)){
        Log.e(TAG,"YES!");
    }else{
        Log.e(TAG,"NO!");
    }

EDIT :::::::::

这看起来怎么样?

我最后只是使用SimpleDateFormat和toGMTString()确保两个日期不相同;

  String serverLastModified = status.getHeader("last-modified");
                SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyy HH:mm:ss zzz");

                Date d = null;
                try {
                    d = sdf.parse(serverLastModified);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Date fileLastGotten = status.getTime();

                Log.e("DATE1", d.toGMTString());
                Log.e("DATE2", fileLastGotten.toGMTString());

                if (d.before(fileLastGotten)) {
                    Log.e("DS", "YES!");
                } else {
                    Log.e("DS", "NO!");
                }

3 个答案:

答案 0 :(得分:1)

我刚刚完成了一个名为droidQuery的开源库,如果数据未被修改,可以通过返回错误而不是成功来为您处理此任务:

$.ajax(new AjaxOptions(url).type("GET")
                           .dataType("XML")
                           .ifModified(true)
                           .context(this)
                           .success(new Function() {
                               @Override
                               public void invoke($ droidQuery, Object... params) {
                                   Document xml = (Document) params[0];
                                   //TODO parse XML Document
                               }
                           })
                           .error(new Function() {
                               @Override
                               public void invoke($ droidQuery, Object... params) {
                                   int status = (Integer) params[1];
                                   if (status == 304) {
                                       Log.i("ajax", "data was not modified. No need to parse");
                                   }
                                   else {
                                       Log.e("ajax", "error: " + (String) params[2];
                                   }
                               }
                           }));

答案 1 :(得分:0)

本机应用程序应保留您要解析的文件的MD5哈希值。在请求文件之前,请从服务器请求其MD5。如果此MD5与本地MD5匹配,则不会请求该文件。否则做并解析它。如果解析了新文件,请不要忘记更新本机MD5。

答案 2 :(得分:0)

你应该用

来捣蛋
try {
    long serverTime = Date.parse(serverLastModified).getTime();
    long myTime = status.getTime.getTime();
    if (serverTime != myTime) {
        //Not equals
    } else {
        //equals
    }
} catch (Exception e) {
    //can't parse server string
}