我有一个imageView和一个Bitmap,我之前使用AsyncTask从互联网上下载。图片为Google Play应用缩略图,例如:https://lh6.ggpht.com/y8KPuTX0t3-dXVejh0NKvpPqtseEBiFp65Epyu4r5PxDs4GKLf_5sQaPrh7e5fGPLHxs=w300-rw。如您所见,图标的尺寸为300x300,但您可以更改它,修改网址末尾的数字。
使用某些设备(例如三星Galaxy S5或Motorola G),位图正确加载到imageView中,但在其他设备中则没有(除非我将尺寸从300x300更改为50x50,例如,它可以工作)。我已经尝试了不同的方法来下载位图,但它似乎不是问题所在。我试图抓住任何抛出的异常,但似乎没有抛出(我认为它可能是内存问题,但没有任何关于它)。相关代码:
class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
HashMap<String, Bitmap> images;
String url;
Context context;
String titleImage;
TextView titleTextView;
/**
* Constructor. Create a new BitMapDownloader object.
* @param imageView view where introduce the selected image
*/
public BitmapDownloaderTask(ImageView imageView, String url, HashMap<String, Bitmap> images, Context context, String titleImage, TextView titleTextView) {
this.images = images;
imageViewReference = new WeakReference<ImageView>(imageView);
this.url = url;
this.context = context;
this.titleImage = titleImage;
this.titleTextView = titleTextView;
}
@Override
/**
* Download method. Run in the task thread
* @param params comes from the execute() call. params[0] is the url
* @return a Bitmap with the image
*/
protected Bitmap doInBackground(String... params) {
return downloadBitmap(params[0]);
}
@Override
/**
* Method to associates the image to the imageView once is downloaded
*/
protected void onPostExecute(Bitmap bitmap) {
try{
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
images.put(url, bitmap);
titleTextView.setText(titleImage);
ImageDownloader.doAnimation(imageView, context);
}
}
}
}catch(Exception e){
Log.d("Error", " Crazy Error:" + e);
}
}
public static Bitmap downloadBitmap(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (Exception e) {
Log.v("Error", "Error:" + e);
e.printStackTrace();
}
return null;
}
我通过以下方式执行此异步任务:
public void downloadAndSetImage(Context context, String url, ImageView imageView, String titleImage, TextView titleTextView) {
BitmapDownloaderTask task = new BitmapDownloaderTask(imageView, url, images, context, titleImage, titleTextView);
if(!images.containsKey(url)){
task.execute(url);
}
else{
imageView.setImageBitmap(images.get(url));
titleTextView.setText(titleImage);
doAnimation(imageView, context);
}
}
imageView就像这样简单:
<RelativeLayout
android:id="@+id/suggestedAppRelativeLayout1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.25"
android:gravity="center_vertical" >
<ImageView
android:id="@+id/suggestedAppIconImageView1"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerHorizontal="true" />
我猜问题是将位图的大小调整为imageView。这就是为什么我在将Bitmap设置为ImageView之前尝试了不同的方法,但它没有工作:
bmp=Bitmap.createScaledBitmap(bmp, imageView.getWidth(), imageView.getHeight(), true);
任何帮助或想法都会非常棒!干杯!
答案 0 :(得分:0)
尝试设置myBitmap.setDensity(320);
在我的案例中有所帮助。 我也必须这样做: BitmapDrawable bmd = new BitmapDrawable(Resources.getSystem(),output);
但是我没有在你的代码中看到你可能需要它的地方,只是为了获取信息。 无论如何setDensity可能会有所帮助
招呼 克里斯