位图仅出现在某些设备中

时间:2014-11-04 10:20:18

标签: android bitmap imageview

我有一个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);

任何帮助或想法都会非常棒!干杯!

1 个答案:

答案 0 :(得分:0)

尝试设置myBitmap.setDensity(320);

在我的案例中有所帮助。 我也必须这样做:  BitmapDrawable bmd = new BitmapDrawable(Resources.getSystem(),output);

但是我没有在你的代码中看到你可能需要它的地方,只是为了获取信息。 无论如何setDensity可能会有所帮助

招呼 克里斯