我有一个简单的
Android小部件,我想用互联网上的图像更新.我可以在小部件上显示静态图像没问题.我被告知你需要使用异步任务,我对这些没有多少经验.
这是我的小部件:
@Override public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) { super.onUpdate(context,appWidgetManager,appWidgetIds); for (int i = 0; i < appWidgetIds.length; i++){ int appWidgetId = appWidgetIds[i]; RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main); //Setup a static image,this works fine. views.setImageViewResource(R.id.imageView1,R.drawable.wordpress_icon); new DownloadBitmap().execute("MyTestString"); appWidgetManager.updateAppWidget(appWidgetId,views); }
然后我有一个异步任务类来进行下载.它看起来像这样:
public class DownloadBitmap extends AsyncTask<String,Void,Bitmap> { /** The url from where to download the image. */ private String url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"; @Override protected Bitmap doInBackground(String... params) { try { InputStream in = new java.net.URL(url).openStream(); Bitmap bitmap = BitmapFactory.decodeStream(in); return bitmap; //NOTE: it is not thread-safe to set the ImageView from inside this method. It must be done in onPostExecute() } catch (Exception e) { Log.e("ImageDownload","Download Failed: " + e.getMessage()); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } //Here is where I should set the image to the imageview,but how? } }
我认为我的代码已成功从互联网上下载图像.
我很困惑的是,如何从Async任务类中将此图像放入特定小部件的“ImageView”中.要更新映像,您需要访问3个不同的对象:Context,AppWidgetManager和AppWidgetId ….但是如何在此语句中传递所有这些对象:???
new DownloadBitmap().execute("MyTestString");
谢谢!
解决方法
一种解决方案是将RemoteViews作为参数传递给DownloadBitmap构造函数,并在onPostExecute()中设置图像:
在onUpdate()中:
new DownloadBitmap(views).execute("MyTestString");
并在DownloadBitmap中:
//.... public class DownloadBitmap extends AsyncTask<String,Bitmap> { private RemoteViews views; public DownloadBitmap(RemoteViews views){ this.views = views; } //..... public void onPostExecute(Bitmap bitmap){ views.setImageViewBitmap(R.id.imageView1,bitmap); } }