开发者

How to deny updating/refreshing ListBox everytime in WP7?

开发者 https://www.devze.com 2023-03-21 23:23 出处:网络
I have a ListBox with ~40-150 items. When I click the Update button, my app checks for new news and messages on a background thread. If there are message or news updates, the app shows the notificatio

I have a ListBox with ~40-150 items. When I click the Update button, my app checks for new news and messages on a background thread. If there are message or news updates, the app shows the notification. Even if there are no new news or message items, my listbox refreshes and still does not respond for 1-10 seconds. How can I disable the update in this case? My code is clear and this threads works in a background. I also have video of the problem.

private void UpdateNews(object sender, EventArgs e) {
            DispatcherTimer timer = new DispatcherTimer() {
            };
            timer.Tick += (a, b) => {
                timer.Stop();
                getData("post_upd");
                };
            timer.Start();
            ProgBar.IsIndeterminate = true;
            ProgBar.Visibility = System.Windows.Visibility.Visible;
        }

public void getData(string filtr) {
            lock (this) {

                    Debug.WriteLine("News: Getting Data");
                    WebClient c = new WebClient();
                    WebClient b = new WebClient();
                    DateTime from = DateTime.Now.AddHours(-30);

                    if (filtr == "post") {

                        b.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/getServerTime?access_token=" + ((App)Application.Current).access_token));
                        b.DownloadStringCompleted += new DownloadStringCompletedEventHandler(server_time_update);


                    }
                    if (filtr == "post_upd") {
                        DispatcherTimer timer = new DispatcherTimer() {
                        };
                        timer.Tick += (a, q) => {
                            timer.Stop();
                            b.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/getServerTime?access_token=" + ((App)Application.Current).access_token));
                            b.DownloadStringCompleted += new DownloadStringCompletedEventHandler(server_time_update);
                            c.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/newsfeed.get?start_time=" + ((App)Application.Current).server_time + "&filters=post" + "&access_token=" + ((App)Application.Current).access_token));
                            c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(posts_update);
                            newslistBox.PullSubtext = "Обновлено в " + DateTime.Now.ToString("HH:mm:ss");
                        };
                        timer.Start();

                    }
            }

private void after_server_time_update(string filtr) {
            WebClient c = new WebClient();
            c.DownloadStringAsync(new Uri("...?start_time=" + (((App)Application.Current).server_time - 8600) + "&filters=" + filtr + "&access_token=" + ((App)Application.Current).access_token));
            c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(posts_downloaded);
            newslistBox.PullSubtext = "Обновлено в " + DateTime.Now.ToString("HH:mm:ss");
        }
  private void posts_downloaded(object sender, DownloadStringCompletedEventArgs e) {
            if (e.Error == null && (NetworkInterface.GetIsNetworkAvailable())) {
                lock (this) {
                    Debug.WriteLine("News: Posts Downloaded online");
                    string json = e.Result;
                    var response = JObject.Parse(json);
                    // Debug.WriteLine(response);
                    string att_type = "";
                    list = new List<Data>();
                    prof_list = new List<Profiles>();
                    groups_list = new List<Groups>();
                    Profiles p_item = null;
                    Groups g_item = null;
                        #region SWTICH
                        switch (att_type) {
                            case "photo":...
                                break;
                            case "graffiti":...
                                list.Add(item);
                                break;
                            case "audio":...
                                };
                                list.Add(item);
                                break;
                            case "link":...};
                                list.Add(item);
                                break;
                            case "note":
                                item = new Data {...
                                list.Add(item);
                                break;
                            case "post":...
                                list.Add(item);
                                break;
                            case "poll":
                                item = new Data {....
                                list.Add(item);
                                break;
                            case "video":....
                                list.Add(item);
                                break;
                        }
                        #endregion
                    }
                    this.newslistBox.ItemsSource = list;

                    ProgBar.IsIndeterminate = false;
                    ProgBar.Visibility = Visibility.Collapsed;
                }
            } else {
                ToastPrompt toast = new ToastPrompt();
                // Debug.WriteLine(who.ToString());
                //  Debug.WriteLine(who.FirstOrDefault()[4].ToString());
                toast.TextOrientation = System.Windows.Controls.Orientation.Vertical;
                toast.Title = "Ошибка";
                toast.Message = "Нет соединения с интернетом";
                toast.MillisecondsUntilHidden = 7000;
                toast.Show();
            }
        }
        private void posts_update(object sender, DownloadStringCompletedEventArgs e) {
            if (e.Error == null && (NetworkInterface.GetIsNetworkAvailable())) {
                lock (this) {
                    Debug.WriteLine("News: Posts Updated online");
                    string json = e.Result;
                    var response = JObject.Parse(json);
                    if (response["response"]["items"].HasValues) {
                        // Debug.WriteLine(response);
                        string att_type = "";
                        //list = new List<Data>();
                        prof_list = new List<Profiles>();
                        groups_list = new List<Groups>();
                        Profiles p_item = null;
                        Groups g_item = null;

                        #region FOR I ITems
                        for (int i = 0; i < response["response"]["profiles"].Count(); i++) {
                            p_item = new Profiles() {
                                p_firstname = response["response"]["profiles"][i]["first_name"].ToString(),
                                p_lastname = response["response"]["profiles"][i]["last_name"].ToString(),
                                p_profile_image = response["response"]["profiles"][i]["photo"].ToString(),
                                p_uid = (int)response["response"]["profiles"][i]["uid"]
                            };
                            //prof_list.Insert(p_item);
                            prof_list.Add(p_item);
                        }
                        for (int i = 0; i < response["response"]["groups"].Count(); i++) {
                            g_item = new Groups() {
                                g_name = response["response"]["groups"][i]["name"].ToString(),
                                g_photo = response["response"]["groups"][i]["photo"].ToString(),
                                g_uid = (int)response["response"]["groups"][i]["gid"]
                            };
                            groups_list.Add(g_item);
                        }
                        for (int i = 0; i < response["response"]["items"].Count(); i++) {
                            if (response["response"]["items"][i].ToString().Contains("attachment")) {
                                string type = response["response"]["items"][i]["attachment"]["type"].ToString();
                                if (type == "photo" || type == "posted_photo")
                                    att_type = "photo";
                                else if (type == "audio")
                                    att_type = "audio";
                                else if (type == "link")
                                    att_type = "link";
                                else if (type == "note")
                                    att_type = "note";
                                else if (type == "poll")
                                    att_type = "poll";
                                else if (type == "graffiti")
                                    att_type = "graffiti";
                                else if (type == "video")
                                    att_type = "video";
                                else
                                    Debug.WriteLine("Error news.xmal postdown", type);
                            } else
                                att_type = "post";
                            Data item = null;
                            var items = response["response"]["items"];
                            string to_autorname = "";
                            string to_auth = "";
                            if ((int)items[i]["source_id"] > 0) {
                                var x = from z in prof_list
                                        where z.p_uid == (int)items[i]["source_id"]
                                        select z;
                                to_autorname = x开发者_如何学运维.FirstOrDefault().p_profile_image;
                                to_auth = x.FirstOrDefault().p_firstname + " " + x.FirstOrDefault().p_lastname;
                            } else {
                                var x = from z in groups_list
                                        where z.g_uid == -(int)items[i]["source_id"]
                                        select z;
                                to_autorname = x.FirstOrDefault().g_photo;
                                to_auth = x.FirstOrDefault().g_name;
                            }
                        #endregion
                            #region SWTICH
                            switch (att_type) {
                                case "photo":
                                    item = new Data {
                                        attachment_type = "photo",
                                        image_src = items[i]["attachment"]["photo"]["src"].ToString(),
                                        image_src_big = items[i]["attachment"]["photo"]["src_big"].ToString(),
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        pid_photo = (int)items[i]["attachment"]["photo"]["pid"],
                                        owner_id = (int)items[i]["attachment"]["photo"]["owner_id"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        post_id = (int)items[i]["post_id"],
                                        author_name = to_auth,
                                        image_uri = to_autorname,
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    //list.Add( item);
                                    break;
                                case "graffiti":
                                    item = new Data {
                                        attachment_type = "graffiti",
                                        image_src = items[i]["attachment"]["graffiti"]["src"].ToString(),
                                        image_src_big = items[i]["attachment"]["graffiti"]["src_big"].ToString(),
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        pid_photo = (int)items[i]["attachment"]["graffiti"]["gid"],
                                        owner_id = (int)items[i]["attachment"]["graffiti"]["owner_id"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        post_id = (int)items[i]["post_id"],
                                        author_name = to_auth,
                                        image_uri = to_autorname,
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                                case "audio":
                                    item = new Data {
                                        attachment_type = "audio",
                                        audio_text = items[i]["attachment"]["audio"]["performer"].ToString() + " - " + items[i]["attachment"]["audio"]["title"].ToString(),
                                        audioUri = "",
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        audioid = (int)items[i]["attachment"]["audio"]["aid"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        post_id = (int)items[i]["post_id"],
                                        author_name = to_auth,
                                        image_uri = to_autorname,
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                                case "link":
                                    item = new Data {
                                        attachment_type = "link",
                                        url = items[i]["attachment"]["link"]["url"].ToString(),
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        title = items[i]["attachment"]["link"]["title"].ToString(),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        image_uri = to_autorname,
                                        author_name = to_auth,
                                        post_id = (int)items[i]["post_id"],
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],

                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                                case "note":
                                    item = new Data {
                                        attachment_type = "note",
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        title = items[i]["attachment"]["note"]["title"].ToString().Replace("&quot;", "\""),
                                        image_src = items[i]["attachment"]["link"]["image_src"].ToString(),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        noteid = (int)items[i]["attachment"]["note"]["nid"],
                                        owner_id = (int)items[i]["attachment"]["note"]["owner_id"],
                                        uid = (int)items[i]["uid"],
                                        image_uri = to_autorname,
                                        author_name = to_auth,
                                        post_id = (int)items[i]["post_id"],
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    //  list.Add(item);
                                    break;
                                case "post":
                                    item = new Data {
                                        attachment_type = "post",
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        image_uri = to_autorname,
                                        author_name = to_auth,
                                        post_id = (int)items[i]["post_id"],
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                                case "poll":
                                    item = new Data {
                                        attachment_type = "poll",
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        image_uri = to_autorname,
                                        author_name = to_auth,
                                        poll_question = "Опрос: " + items[i]["attachment"]["poll"]["question"].ToString(),
                                        poll_id = (int)items[i]["attachment"]["poll"]["poll_id"],
                                        post_id = (int)items[i]["post_id"],
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                                case "video":
                                    item = new Data {
                                        image_src = items[i]["attachment"]["video"]["image"].ToString(),
                                        image_src_big = items[i]["attachment"]["video"]["image_big"].ToString(),
                                        text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""),
                                        likes_count = (int)items[i]["likes"]["count"],
                                        pid_photo = (int)items[i]["attachment"]["video"]["vid"],
                                        owner_id = (int)items[i]["attachment"]["video"]["owner_id"],
                                        attachment_type = "photo",
                                        isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]),
                                        uid = (int)items[i]["source_id"],
                                        image_uri = to_autorname,
                                        author_name = to_auth,
                                        post_id = (int)items[i]["post_id"],
                                        Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"),
                                        comm_count = (int)items[i]["comments"]["count"],
                                    };
                                    list.Insert(0, item);
                                    // list.Add(item);
                                    break;
                            }
                            #endregion
                        }

                        //this.newslistBox.ItemsSource = null;

                        this.newslistBox.ItemsSource = list;
                        Debug.WriteLine("Itemsspurce updated");
                    } else {
                        ToastPrompt toast = new ToastPrompt();
                         //Debug.WriteLine(who.ToString());
                       //   Debug.WriteLine(who.FirstOrDefault()[4].ToString());
                        toast.TextOrientation = System.Windows.Controls.Orientation.Vertical;
                        toast.Message = "Нету новых новостей";
                        toast.MillisecondsUntilHidden = 2000;
                        toast.Show();
                    }

                   ProgBar.IsIndeterminate = false;
                    ProgBar.Visibility = Visibility.Collapsed;

                }...


A few things from a quick look at your code:

  • Don't use WebClient, as it returns on the UI thread which is probably the cause of your UI hanging issue. Instead use HttpWebRequest. Note that this behaviour changes in Mango

  • NetworkInterface.GetIsNetworkAvailable() can be slow. Do you really need to call it when you've got your response from the web request.

  • Look at using a BackgroundWorker rather than creating a DispatcherTimer with no interval.

  • In that your requests are all to the same site, could htey not be combined (wrapped?) into a single request?

  • Probably the main issue: you are always replacing the list with what has been returned from the server regardless of whether it has changed or not. You probably want to update the collection if it exists and there are changes with the data returned from the server.

  • If sharing code to demonstrate a problem try and only include the minimum needed to recreate the issue.

  • Give variables meaningful names. It helps other people read (and hopefully understand) your code more easily.

  • Seriousy, a 240+ line method?!? That's not a good way to create maintainable code.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号