Сборка мусора отключает ListView Source от загрузки форм Xamarin - PullRequest
0 голосов
/ 17 сентября 2018

Возникла проблема, из-за которой мои исходные объекты списка были собраны в моем приложении.У меня есть страница с вкладками, и страница содержимого по умолчанию имеет рабочий вид списка, и с почти идентичным кодом вторая страница содержимого имеет другой вид списка, но объекты не отображаются.Есть ли способ предотвратить их сборку мусора?

Вот мой код:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using MIApp.Classes;
using Xamarin.Forms;

namespace MIApp
{
    public partial class VideosListPage : ContentPage
    {
        public VideosListPage()
        {
            InitializeComponent();
        }

        protected async override void OnAppearing()
        {
            base.OnAppearing();

            HttpClient client = new HttpClient();
            string url = "https://example.net/api/Videos/GetVideos";
            var response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                string res = "";
                using (HttpContent content = response.Content)
                {
                    Task<string> result = content.ReadAsStringAsync();
                    res = result.Result;
                    var VideosList = Videos.VideosItems.FromJson(res);
                    VideosListView.ItemsSource = VideosList;
                }
            }
            else
            {
                await DisplayAlert("Connection Error", "Please Connect to the internet and try again", "Ok");
            }
        }
    }
}

Итак, я получаю строку JSON из API, который преобразует записи в базе данных вJSON массив объектов.Затем я преобразовываю его в список объектов, когда объявляю VideosList var из класса, в котором объекты создаются и десериализуются:Список видеороликов расширяется и содержит правильное количество объектов, но ресурс не может быть найден, поскольку объекты были собраны сборщиком мусора.

Спасибо, Райан

1 Ответ

0 голосов
/ 17 сентября 2018

Сделать VideosList глобальной переменной, его область действия ограничена

        using (HttpContent content = response.Content)
        {
            Task<string> result = content.ReadAsStringAsync();
            res = result.Result;
            var VideosList = Videos.VideosItems.FromJson(res);
            VideosListView.ItemsSource = VideosList;
        }

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

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