繁体   English   中英

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

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

我有一个包含约 40-150 个项目的列表框。 当我单击更新按钮时,我的应用程序会在后台线程上检查新新闻和消息。 如果有消息或新闻更新,应用程序会显示通知。 即使没有新的新闻或消息项,我的列表框也会刷新并且 1-10 秒内仍然没有响应。 在这种情况下如何禁用更新? 我的代码很清楚,而且这个线程在后台工作。 我也有这个问题的视频

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;

                }...

快速查看您的代码的几件事:

  • 不要使用WebClient ,因为它会在 UI 线程上返回,这可能是您的 UI 挂起问题的原因。 而是使用HttpWebRequest 请注意,这种行为在 Mango 中发生了变化

  • NetworkInterface.GetIsNetworkAvailable()可能很慢。 当您收到 web 请求的响应时,您真的需要调用它吗?

  • 考虑使用BackgroundWorker而不是创建没有间隔的DispatcherTimer

  • 由于您的请求都发往同一个站点,htey 不能组合(包装?)成一个请求吗?

  • 可能是主要问题:您总是用服务器返回的内容替换列表,无论它是否已更改。 如果集合存在并且从服务器返回的数据发生更改,您可能希望更新该集合。

  • 如果共享代码以演示问题,请尝试仅包含重新创建问题所需的最低限度。

  • 给变量起有意义的名字。 它可以帮助其他人更轻松地阅读(并希望能够理解)您的代码。

  • 严重的是,240+ 行方法??。 这不是创建可维护代码的好方法。

暂无
暂无

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

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