#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
}
}
=> Дополнительная информация здесь