Преобразование функции загрузки в асинхронную

#android #asynchronous #xamarin #android-bitmap #webclient-download

#Android #асинхронный #xamarin #android-растровое изображение #webclient

Вопрос:

Я использую Xamarin и загружаю много изображений для GridView .

Вот мой код, который я вызываю для каждого изображения:

 private Bitmap GetImageBitmapFromUri(string uri)
{
    Bitmap imageBitmap = null;

    using (var webClient = new WebClient())
    {
        var imageBytes = webClient.DownloadData(uri);
        if (imageBytes != null amp;amp; imageBytes.Length > 0)
        {
            imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        }
    }

    return imageBitmap;
}
  

Может кто-нибудь, пожалуйста, помочь мне сделать этот код выше асинхронным?

Заранее спасибо

Комментарии:

1. Какой у вас Xamarin. Версия Android? 4.8 или ниже 4.8?

2. Мой Xamarin. Версия Android 4.8

Ответ №1:

Вы можете использовать метод Async / Await with WebClient ‘s DownloadDataTaskAsync , чтобы сделать ваш код асинхронным, как определено здесь в примере:

 async Task<Bitmap> downloadAsync(object sender, System.EventArgs ea)
{
  WebClient webClient = new WebClient();
  var url = new Uri("http://photojournal.jpl.nasa.gov/jpeg/PIA15416.jpg");
  byte[] bytes = null;

  try{
    bytes = await webClient.DownloadDataTaskAsync(url);
  }
  catch(TaskCanceledException){
    // Exception
    return;
  }
  catch(Exception e){
    // Exception
    return;
  }

  Bitmap bitmap = await BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);

  return bitmap;    
}
  

Ответ №2:

Это эквивалентная C # AsyncTask, которую можно найти в JAVA :

 public class DownloadBitmap : AsyncTask
{
    protected override void OnPreExecute()
    {
         //launch loading dialog.. before your main task
    }

    protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
    {
         //download your Bitmap
    }

    protected override void OnPostExecute(Java.Lang.Object result)
    {
         //return your Bitmap to update the UI
    }
}
  

=> Дополнительная информация здесь