use*_*342 6 android widget android-asynctask
我有一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个异步任务类来进行下载.它看起来像这样:
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?
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我的代码已成功从互联网上下载图像.
我很困惑的是,如何从Async任务类中将此图像放入特定小部件的"ImageView"中.要更新映像,您需要访问3个不同的对象:Context,AppWidgetManager和AppWidgetId ....但是如何在此语句中传递所有这些对象:???
new DownloadBitmap().execute("MyTestString");
Run Code Online (Sandbox Code Playgroud)
谢谢!
一种解决方案是将RemoteViews
作为参数传递给DownloadBitmap
构造函数,并onPostExecute()
设置图像:
在onUpdate()中:
new DownloadBitmap(views).execute("MyTestString");
Run Code Online (Sandbox Code Playgroud)
并在DownloadBitmap中:
//....
public class DownloadBitmap extends AsyncTask<String, Void, Bitmap> {
private RemoteViews views;
public DownloadBitmap(RemoteViews views){
this.views = views;
}
//.....
public void onPostExecute(Bitmap bitmap){
views.setImageViewBitmap(R.id.imageView1, bitmap);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8547 次 |
最近记录: |