Как отрицать обновление / обновление ListBox каждый раз в WP7? - PullRequest
0 голосов
/ 20 июля 2011

У меня есть ListBox с ~ 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;

                }...

1 Ответ

1 голос
/ 21 июля 2011

Несколько вещей из быстрого просмотра вашего кода:

  • Не используйте WebClient, так как он возвращается в поток пользовательского интерфейса, который, вероятно, является причиной зависания вашего пользовательского интерфейса.вопрос.Вместо этого используйте HttpWebRequest. Обратите внимание, что это изменение поведения в манго

  • NetworkInterface.GetIsNetworkAvailable() может быть медленным.Вам действительно нужно позвонить, когда вы получите ответ от веб-запроса.

  • Обратите внимание на использование BackgroundWorker вместо создания DispatcherTimer без интервала.

  • Поскольку все ваши запросы относятся к одному и тому же сайту, не могут ли они быть объединены (упакованы?) В один запрос?

  • Вероятно, основная проблема: Вы всегда заменяете список тем, что было возвращено с сервера, независимо от того, изменился он или нет.Возможно, вы захотите обновить коллекцию, если она существует, и есть изменения в данных, возвращаемых с сервера.

  • Если для совместного использования кода необходимо продемонстрировать проблему, попробуйте указать только минимальное количество, необходимое для восстановленияпроблема.

  • Дайте переменным значимые имена.Это помогает другим людям легче читать (и, надеюсь, понять) ваш код.

  • Серьезно, метод с 240+ строками?!?Это не хороший способ создания поддерживаемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...