简体   繁体   English

如何在 WP7 中每次都拒绝更新/刷新 ListBox?

[英]How to deny updating/refreshing ListBox everytime in WP7?

I have a ListBox with ~40-150 items.我有一个包含约 40-150 个项目的列表框。 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.即使没有新的新闻或消息项,我的列表框也会刷新并且 1-10 秒内仍然没有响应。 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.不要使用WebClient ,因为它会在 UI 线程上返回,这可能是您的 UI 挂起问题的原因。 Instead use HttpWebRequest .而是使用HttpWebRequest Note that this behaviour changes in Mango请注意,这种行为在 Mango 中发生了变化

  • NetworkInterface.GetIsNetworkAvailable() can be slow. NetworkInterface.GetIsNetworkAvailable()可能很慢。 Do you really need to call it when you've got your response from the web request.当您收到 web 请求的响应时,您真的需要调用它吗?

  • Look at using a BackgroundWorker rather than creating a DispatcherTimer with no interval.考虑使用BackgroundWorker而不是创建没有间隔的DispatcherTimer

  • In that your requests are all to the same site, could htey not be combined (wrapped?) into a single request?由于您的请求都发往同一个站点,htey 不能组合(包装?)成一个请求吗?

  • 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??.严重的是,240+ 行方法??。 That's not a good way to create maintainable code.这不是创建可维护代码的好方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM