Как отобразить изображение с json URL в интернете - PullRequest
0 голосов
/ 20 апреля 2020

новый программист xamarin здесь. Мне нужно отобразить comi c изображение из inte rnet, используя URL, но почему-то система продолжает сообщать мне, что ссылка на URL не работает, но я не знаю, почему, когда я создаю новый UriImageSource.

Мой первый метод состоял в том, чтобы попытаться отобразить изображение, используя BitMapImage , но оно доступно только для WindowsForms или WPF, поэтому мне нужна альтернатива для этого, если UriImageSource не работает для меня. Я нахожусь на Ма c кстати.

Это xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Weather_App.MainPage"> 
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackLayout Grid.Row="1" Orientation="Horizontal" HorizontalOptions="Center">
            <Image x:Name="backgroundImage" Margin="20"/>

        </StackLayout>
    </Grid>
</ContentPage>

Это MainPage.cs:

using Xamarin.Forms;

namespace Weather_App
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage 
    {
        private int maxNumber = 0;
        private int currentNumber = 0;

        public MainPage()
        {
            InitializeComponent();
            ViewModel.ApiHelper.InitializeClient();

            string url = Convert.ToString(ComicProcessor.LoadComic());
            backgroundImage.Source = new UriImageSource
            {
                Uri = new Uri(url),
                CachingEnabled = false,
                CacheValidity = TimeSpan.FromHours(1)
            };

        }
    }
}

Наконец, это является методом viewmodel / LoadComi c Сначала я попытался вернуть comi c вместо URL, но поскольку BitMapImage для Ma c не существовало, я возвратил url вместо , потому что думал, что мог бы использовать его для Экземпляр UriImageSource. Свойства comi c включают целое число Num и строку Img.

namespace Weather_App
{
    public class ComicProcessor
    {
        public static int MaxComicNumber { get; set; }
        public async static Task<string> LoadComic(int comicNumber = 0)
        {
            string url = "";
            if (comicNumber > 0)
            {
                url = $"https://xkcd.com/{comicNumber}/info.0.json";
            }
            else
            {
                url = $"https://xkcd.com/info.0.json";
            }

            using (HttpResponseMessage response = await ViewModel.ApiHelper.ApiClient.GetAsync(url))
            {
                if (response.IsSuccessStatusCode)//If response successful do something then
                {
                    // Takes data in as json and converted it to the type you have given and match anything that it finds 
                    ComicModel comic = await response.Content.ReadAsAsync<ComicModel>();

                    if (comicNumber == 0)
                    {
                        MaxComicNumber = comic.Num;
                    }

                    return url;
                }
                else
                {
                    // Outputs reason why it wasn't successful
                    throw new Exception(response.ReasonPhrase);
                }

            }


        }
    }
}

1 Ответ

1 голос
/ 20 апреля 2020

Я бы предложил вам использовать FFImageLoading's CachedImage для этого.

Это библиотека, которая широко принята сообществом и отлично подходит для кэширования, а также имеет опции обработки памяти.

Вы можете проверить их Git вики , чтобы глубже понять библиотеку.

Скачать эту форму Nuget

Позвонить CachedImageRenderer.Init() на каждой платформе. Давайте поместим его в MainActivity.cs нашего Android проекта и AppDelegate.cs из iOS.

Затем добавим его пространство имен и используем его так:

  <ffimageloading:CachedImage
                HorizontalOptions="Center" VerticalOptions="Center"
                DownsampleToViewSize="true"
                Source = "{Binding ImageUrl}">
        </ffimageloading:CachedImage>

Xamarin.Forms.Image это вариант, но я лично чувствую, что он не работает с изображениями URL.

Также просто дайте CachedImage URL, и он сделает загрузку за вас!

Goodluck,

Не стесняйтесь возвращаться, если у вас есть вопросы.

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