我正在尝试制作一个ImageView
的动态窗口小部件。我正在尝试使用AsyncTask
从网址下载图片,然后尝试将新下载的位图应用到ImageView
,但小部件中没有任何内容。
这是小部件中发生的Java代码:
public class MyWidget extends AppWidgetProvider
{
private static RemoteViews remoteViews;
private static String thumbnailUrl = "..."; // The image I'd like to show
// Async task for downloading an image and setting it to the ImageView
class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{
@Override
protected Bitmap doInBackground(String... urls)
{
String url = urls[0];
Bitmap icon = null;
try
{
InputStream in = new java.net.URL(urldisplay).openStream();
icon = BitmapFactory.decodeStream(in);
}
catch(Exception e)
{
e.printStackTrace();
}
return icon;
}
@Override
protected void onPostExecute(Bitmap bitmap)
{
if(bitmap == null)
{
System.out.println("Bitmap is null!");
return;
}
remoteViews.setImageViewBitmap(R.id.thumbnailView, bitmap);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager manager, int[] widgetIds)
{
if(remoteViews == null)
{
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
}
new DownloadImageTask().execute(thumbnailUrl);
}
} // End of MyWidget
小部件确实有效,因为如果我在那里放置一个静态TextView
,它就会显示出来。但是,ImageView
没有。视图的ID正确,URL有效。调用onPostExecute()
时,位图不为空。为什么位图不显示?
答案 0 :(得分:1)
首先,将AsyncTask
替换为IntentService
。在您完成工作之前,您的流程很可能会被终止。让AppWidgetProvider
代表加入IntentService
。
其次,使用更好的代码来下载图像比使用更好的代码,因为它不能很好地解决典型的移动问题,如偶发连接。有大量的图像加载库(毕加索,通用图像加载器等)在遇到问题时会更有弹性。
第三,你实际上必须对RemoteViews
做点什么。现在,您拨打setImageViewBitmap()
...然后将RemoteViews
放在地板上。您需要use AppWidgetManager
告诉Android使用RemoteViews
更新应用小部件。
而且,正如Ashish指出的那样,请记住IPC交易有1MB的限制,这将限制Bitmap
的大小。许多图像加载库也内置了重采样逻辑,可以将图像缩放到合适的大小,因此您可以避免这种限制。
答案 1 :(得分:0)
检查你的logcat输出,你得到的东西是 -
错误/ JavaBinder(20204):!!!失败的粘合剂交易!!!
如果是,那么您正在达到文件大小限制:P