在我的Android应用程序中,我想要使用从URL指定的图像更新ImageView。此URL已作为AsyncTask的一部分通过API获取。
我已经按如下方式定义了ImageView:
<ImageView
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_height="wrap_content"
android:id="@+id/product_image"
android:src="@drawable/no_product_image"
android:layout_marginRight="6dip"
android:layout_width="wrap_content"
/>
这样,在加载数据时,ProgressDialog后面会出现一个空白图像。
作为AsyncTask的doInBackground的一部分,在获取产品详细信息后,我打电话给:
private void createProductScreen(Product product){
Log.i(TAG, "Updating product screen");
//Set the product image
ImageView imgView =(ImageView)findViewById(R.id.product_image);
Drawable drawable = loadImageFromWeb(product.getImageUrl());
imgView.setImageDrawable(drawable);
Log.i(TAG, "Set image");
}
图像从网络加载如下:
private Drawable loadImageFromWeb(String url){
Log.i(TAG, "Fetching image");
try{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src");
Log.i(TAG, "Created image from stream");
return d;
}catch (Exception e) {
//TODO handle error
Log.i(TAG, "Error fetching image");
System.out.println("Exc="+e);
return null;
}
}
当这次运行时,我在日志中看到“从流中创建图像”,但没有看到“设置图像”,并且从不调用AsyncTask的onPostExecute
有没有人对此问题有任何想法或更好的方法将图像从空白图像更新到产品图像?
答案 0 :(得分:2)
因为您尝试在单独的线程中设置ImageView,所以应该会出现异常。
必须在同一UI线程中调用imgView.setImageDrawable(drawable);
。
由于您使用的是AsyncTask类,因此设置imageview对象的正确位置在onPostExecute方法中。
以doInBackground将Drawable对象返回到onPostExecute方法的方式更改逻辑,然后使用它调用imgView.setImageDrawable(drawable);
答案 1 :(得分:0)
将Imageview设置为可绘制图像
Drawable drawable = loadImageFromWeb(product.getImageUrl());
这是问题。
Drawable drawable = loadImageFromWeb(XXXXUrl);
Imageview.setImageDrawable(drawable);
为drawable提供正确的URL。