xamarin 通用图像加载器,无需将其置于视图中
xamarin universal image loader without putting it in view
我正在尝试使用 xamarin 中的通用图像加载器将图像加载到变量中。但是它总是 returns null。我尝试了几种方法,但 none 似乎可以解决问题。这是我的代码。唯一在 none 通用图像加载器中工作的一个。
private async void GetImages(CardsAdapter adapter, List<Card> cards)
{
WebClient client = new WebClient();
foreach (var card in cards)
{
//var data = await client.DownloadDataTaskAsync(card.imageUrl);
//card.image = new BitmapDrawable(BitmapFactory.DecodeByteArray(data, 0, data.Length));
//card.image = ImageService.AsBitmapDrawableAsync();
//ImageLoader imageLoader = ImageLoader.Instance;
//Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
var bm = await LoadImage(card);
card.image = new BitmapDrawable(bm);
adapter.NotifyDataSetChanged();
}
}
private async Task<Bitmap> LoadImage(Card card)
{
ImageLoader imageLoader = ImageLoader.Instance;
Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
//imageLoader.LoadImage(card.imageUrl, new SimpleImageLoadingListener());
//Bitmap bm = null;
//imageLoader.LoadImage(
// card.imageUrl,
// new ImageLoadingListener(
// loadingComplete: (imageUri, view, loadedImage) => {
// // Do whatever you want with Bitmap
// bm = loadedImage;
// }));
return bm;
}
感谢您的帮助!
问候,
比约恩
经过对您的代码的多次测试,您的代码运行 排除了android.os.NetworkOnMainThreadException
异常或ImageLoader must be init with configuration before using
错误。第一个异常并没有使程序停止,但它被抛出到日志中。也许这就是为什么您的 Bitmap
都为空的原因。
您可以试试这个代码:
public class MainActivity : Activity, IImageLoadingListener
{
//Your ListView and Adapter
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Set your ListView and Adapter here
ImageLoader imageloader = ImageLoader.Instance;
imageloader.Init(ImageLoaderConfiguration.CreateDefault(this));
foreach (var card in cards)
{
imageloader.LoadImage(card.imageUrl, this);
}
}
public void OnLoadingCancelled(string p0, View p1)
{
}
public void OnLoadingComplete(string p0, View p1, Bitmap p2)
{
foreach (var card in cards)
{
if (card.imageUrl == p0)
{
card.image = p2;
adapter.NotifyDataSetChanged();
}
}
}
public void OnLoadingFailed(string p0, View p1, FailReason p2)
{
}
public void OnLoadingStarted(string p0, View p1)
{
}
}
此代码由我使用,如果仍然无效,请确保您已启用 Internet
功能并且您的图片 url 是正确的。
我正在尝试使用 xamarin 中的通用图像加载器将图像加载到变量中。但是它总是 returns null。我尝试了几种方法,但 none 似乎可以解决问题。这是我的代码。唯一在 none 通用图像加载器中工作的一个。
private async void GetImages(CardsAdapter adapter, List<Card> cards)
{
WebClient client = new WebClient();
foreach (var card in cards)
{
//var data = await client.DownloadDataTaskAsync(card.imageUrl);
//card.image = new BitmapDrawable(BitmapFactory.DecodeByteArray(data, 0, data.Length));
//card.image = ImageService.AsBitmapDrawableAsync();
//ImageLoader imageLoader = ImageLoader.Instance;
//Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
var bm = await LoadImage(card);
card.image = new BitmapDrawable(bm);
adapter.NotifyDataSetChanged();
}
}
private async Task<Bitmap> LoadImage(Card card)
{
ImageLoader imageLoader = ImageLoader.Instance;
Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
//imageLoader.LoadImage(card.imageUrl, new SimpleImageLoadingListener());
//Bitmap bm = null;
//imageLoader.LoadImage(
// card.imageUrl,
// new ImageLoadingListener(
// loadingComplete: (imageUri, view, loadedImage) => {
// // Do whatever you want with Bitmap
// bm = loadedImage;
// }));
return bm;
}
感谢您的帮助!
问候,
比约恩
经过对您的代码的多次测试,您的代码运行 排除了android.os.NetworkOnMainThreadException
异常或ImageLoader must be init with configuration before using
错误。第一个异常并没有使程序停止,但它被抛出到日志中。也许这就是为什么您的 Bitmap
都为空的原因。
您可以试试这个代码:
public class MainActivity : Activity, IImageLoadingListener
{
//Your ListView and Adapter
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Set your ListView and Adapter here
ImageLoader imageloader = ImageLoader.Instance;
imageloader.Init(ImageLoaderConfiguration.CreateDefault(this));
foreach (var card in cards)
{
imageloader.LoadImage(card.imageUrl, this);
}
}
public void OnLoadingCancelled(string p0, View p1)
{
}
public void OnLoadingComplete(string p0, View p1, Bitmap p2)
{
foreach (var card in cards)
{
if (card.imageUrl == p0)
{
card.image = p2;
adapter.NotifyDataSetChanged();
}
}
}
public void OnLoadingFailed(string p0, View p1, FailReason p2)
{
}
public void OnLoadingStarted(string p0, View p1)
{
}
}
此代码由我使用,如果仍然无效,请确保您已启用 Internet
功能并且您的图片 url 是正确的。