Xamarin Android:请求帮助实现从URL加载图片的AsyncTask类
搞定Xamarin Android AsyncTask加载图片的问题
嘿,刚接触Xamarin Android和C#确实会有点摸不着头脑,咱们一步步把这个图片加载的AsyncTask改对~ 先看看你代码里的几个问题,再给你完整的实现方案:
先说说你原代码里的核心问题
- AsyncTask的泛型参数用错了:你需要传入图片URL字符串,返回Bitmap对象,所以泛型应该是
AsyncTask<string, int, Bitmap>,而不是<URL, int, ImageView> - DoInBackground里的变量逻辑混乱:你用了
bitmap但没定义,而且没有实现真正的图片下载逻辑 - OnPostExecute里的错误:不能直接在AsyncTask里调用
FindViewById,也不能把Uri直接塞给ImageView,得用下载好的Bitmap来设置 - 类型转换错误:原代码里的强制转换逻辑完全不对,比如把
bitmap[0]转成ImageView,这根本没有定义bitmap变量
正确的AsyncTask实现
下面是修改后的ImageLoaderTask类,我把名字改得更直观了:
using Android.App; using Android.Content; using Android.Graphics; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Java.Lang; using Java.Net; using System.IO; namespace TestImageURL3._0 { // AsyncTask泛型参数:<传入的参数类型, 进度类型, 返回结果类型> class ImageLoaderTask : AsyncTask<string, int, Bitmap> { private readonly ImageView _targetImageView; // 构造函数传入要显示图片的ImageView,这样Task知道要给哪个控件赋值 public ImageLoaderTask(ImageView targetImageView) { _targetImageView = targetImageView; } // 后台执行下载逻辑,不能操作UI protected override Bitmap DoInBackground(params string[] urls) { Bitmap bitmap = null; if (urls.Length == 0) return bitmap; try { // 建立网络连接,下载图片流 var url = new URL(urls[0]); var connection = url.OpenConnection(); connection.DoInput = true; connection.Connect(); using (var inputStream = connection.InputStream) { // 把输入流解码成Bitmap bitmap = BitmapFactory.DecodeStream(inputStream); } } catch (Exception e) { // 这里可以添加错误日志,比如Log.Error("ImageLoader", e.Message); } return bitmap; } // 后台任务完成后在UI线程执行,用来更新UI protected override void OnPostExecute(Bitmap result) { base.OnPostExecute(result); if (result != null && _targetImageView != null) { // 给ImageView设置下载好的Bitmap _targetImageView.SetImageBitmap(result); } else { // 如果下载失败,可以设置一张默认占位图 // _targetImageView.SetImageResource(Resource.Drawable.default_image); } } } }
MainActivity里的调用代码
在你的MainActivity.cs里,只需要在合适的时机(比如OnCreate方法)找到ImageView,然后启动这个AsyncTask就可以了:
using Android.App; using Android.OS; using Android.Widget; namespace TestImageURL3._0 { [Activity(Label = "@string/app_name", MainLauncher = true)] public class MainActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); // 找到布局里的ImageView var imageView = FindViewById<ImageView>(Resource.Id.imageView1); // 图片URL(建议用HTTPS,避免Android 9+的明文HTTP限制) var imageUrl = "http://www.qygjxz.com/data/out/244/4304228-wallpaper-phone-hd.jpg"; // 实例化Task并执行 var imageLoader = new ImageLoaderTask(imageView); imageLoader.Execute(imageUrl); } } }
必须注意的配置
- 添加网络权限:打开
Properties/AndroidManifest.xml,添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
- 处理Android 9+的明文HTTP限制:如果你的图片URL是HTTP而不是HTTPS,需要在
AndroidManifest.xml的<application>标签里添加android:usesCleartextTraffic="true":
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
这样一来,你的AsyncTask就能正常从URL下载图片并显示在ImageView里啦!如果还有问题可以随时问~
内容的提问来源于stack exchange,提问作者Melissa Courla
相关产品推荐
相关产品推荐

