2017-05-25 1 views
0

Ich kann Informationen aus einer URL-HTML-Datei genauer die Tabellen aus der Klammer-Site Challonge.com abrufen und diese Informationen in einer Listenansicht für eine App mit Xamarin speichern und anzeigen Formen.So erstellen Sie eine Benachrichtigung, wenn Daten von HTML-Seiten einer Website geändert werden

Nun, was ich versuche zu lernen ist, wie Sie die Liste aktualisieren, wenn die Daten aus dem HTML aktualisiert werden. Wenn der Stand auf der Website aktualisiert wird, möchte ich eine Benachrichtigung in meiner App erstellen, die die Änderung in der Rangliste mitteilt.

Ich denke, ich muss eine beobachtbare Sammlung verwenden, um Änderungen in der HTML-Datei zu erkennen? aber ich verstehe nicht, wie es funktioniert oder ob das der richtige Ansatz wäre.

public async Task StartWebCrawl() 
    { 
     // var url = "http://challonge.com/lhswaterwars17/standings"; 
     var url = "http://challonge.com/jex0ymd2/standings"; 

     var httpClient = new HttpClient(); 
     var html = await httpClient.GetStringAsync(url); 

     var htmlDocument = new HtmlDocument(); 
     htmlDocument.LoadHtml(html); 

     var divs = htmlDocument.DocumentNode.Descendants("td") 
      .Where(node => node.GetAttributeValue("class", "") 
      .Equals("left display_name")) 
      .ToList(); 

     var participants = new List<Particpants>(); 
     //var teamName = new List<String>(); 
     var teamStandings = new ObservableCollection<String>(); 

     foreach (var div in divs) 
     { 

      var participant = new Particpants 
      { 
       TeamName = div.Descendants("span").FirstOrDefault().InnerText 

      }; 

      participants.Add(participant); 
     } 
     foreach (var name in participants) 
     { 
      //Debug.WriteLine(name.TeamName); 
      //teamName.Add(name.TeamName); 
      teamStandings.Add(name.TeamName); 
     } 

     //ListView.ItemsSource = teamName; 
     ListView.ItemsSource = teamStandings; 
     teamStandings.CollectionChanged += HandleChange; 

    } 


    private void HandleChange(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     DisplayAlert("Standings", "an Update occured", "Cancel"); 

    } 



} 
+0

, wenn Sie für Änderungen überwachen möchten, finden Sie die aktuellen Ergebnisse speichern müssen, regelmäßig die neuesten Ergebnisse herunterladen und sie dann vergleichen, um zu sehen, ob sie besser – Jason

+0

noch nicht geändert haben, erhalten einen Hash von den Inhalten und vergleichen Sie einfach Hashes. – Trey

+0

Wie würde ich dann regelmäßig die neuesten Ergebnisse erhalten? Würde ich die Funktion alle paar Sekunden anrufen? – BigDuke6

Antwort

0
public async Task StartWebCrawl() 
    { 

     var url = "http://challonge.com/jex0ymd2/standings"; 
     var httpClient = new HttpClient(); 
     var html = await httpClient.GetStringAsync(url); 
     var htmlDocument = new HtmlDocument(); 
     htmlDocument.LoadHtml(html); 

     var participants = new List<Particpants>(); 
     ObservableCollection<String> listStandings = new ObservableCollection<string>(); 


     Device.StartTimer(TimeSpan.FromSeconds(1),() => 
     { 

      Task.Factory.StartNew(async() => 
      { 
       // Do the actual request and wait for it to finish. 
       await httpClient.GetStringAsync(url); 



       // Switch back to the UI thread to update the UI 
       Device.BeginInvokeOnMainThread(() => 
       { 
        // Update the UI 
        var divs = htmlDocument.DocumentNode.Descendants("td") 
        .Where(node => node.GetAttributeValue("class", "") 
        .Equals("left display_name")) 
        .ToList(); 

        foreach (var div in divs) 
        { 

         var participant = new Particpants 
         { 
          TeamName = div.Descendants("span").FirstOrDefault().InnerText 

         }; 

         participants.Add(participant); 

        } 

        foreach (var name in participants) 
        { 

         listStandings.Add(name.TeamName); 
        } 
        ListView.ItemsSource = listStandings; 
        // Now repeat by scheduling a new request 
        StartWebCrawl(); 
       }); 

      }); 

      // Don't repeat the timer (we will start a new timer when the request is finished) 

      return false; 
     }); 

    } 
Verwandte Themen