0

在我的应用程序中,我必须从 url 在图像视图中显示图像。Web 服务提供了完整的列表,其中包含与它们相关的所有信息。我将所有信息存储到数据访问对象中并将其传递到详细信息页面。在我的详细信息页面上,我必须显示从网络服务获得的 url 中的图像。但是,图像没有显示出来。下面是我的代码:

图像加载器

public class ImageLoader {

public static final String TAG = "ImageLoaderSN";
public enum BitmapManager {
    INSTANCE;

    private final Map<String, SoftReference<Bitmap>> cache;
    private final ExecutorService pool;
    private Map<ImageView, String> imageViews = Collections
            .synchronizedMap(new WeakHashMap<ImageView, String>());
    private Bitmap placeholder;

    BitmapManager() {
        cache = new HashMap<String, SoftReference<Bitmap>>();
        pool = Executors.newFixedThreadPool(5);
    }

    public void setPlaceholder(Bitmap bmp) {
        placeholder = bmp;
    }

    public Bitmap getBitmapFromCache(String url) 
    {
        //Log.v(TAG, "getBitmapFromCache called");
        if (cache.containsKey(url)) 
        {
            //Log.v(TAG, "getBitmapFromCache if loop");
            return cache.get(url).get();
        }

        return null;
    }

    public void queueJob(final String url, final ImageView imageView,
            final int width, final int height) 
    {
        Log.v(TAG, "queueJob called");
        //Create handler in UI thread. 
        final Handler handler = new Handler() 
        {
            public void handleMessage(Message msg) 
            {
                //Log.v(TAG, "queueJob handleMessage called");
                String tag = imageViews.get(imageView);
                if (tag != null && tag.equals(url)) 
                {
                    //Log.v(TAG, "queueJob tag not null");
                    if (msg.obj != null) 
                    {
                        //Log.v(TAG, "queueJob msg.obj not null");
                        imageView.setImageBitmap((Bitmap) msg.obj);
                    } else 
                    {
                        imageView.setImageBitmap(placeholder);
                        //Log.v(TAG, "queueJob fail " + url);
                    }
                }
            }
        };

        pool.submit(new Runnable() {
            public void run() {
                final Bitmap bmp = downloadBitmap(url, width, height);
                Message message = Message.obtain();
                message.obj = bmp;
                //Log.d(null, "Item downloaded: " + url);

                handler.sendMessage(message);
            }
        });
    }

    public void loadBitmap(String url, final ImageView imageView,
            final int width, final int height) 
    {
        //Log.v(TAG, "loadBitmap called");
        if(url.contains(" "))
        {
            //Log.v(TAG, "if url contains spaces");
          url  = url.replaceAll(" ", "%20");

        }
        imageViews.put(imageView, url);
        Bitmap bitmap = getBitmapFromCache(url);

        // check in UI thread, so no concurrency issues
        if (bitmap != null) 
        {
            //Log.v(TAG, "Item loaded from cache: " + url);
            imageView.setImageBitmap(bitmap);
        } 
        else 
        {
            //Log.v(TAG, "else loadBitmap");
            imageView.setImageBitmap(placeholder);
            queueJob(url, imageView, width, height);
        }
    }

    public Bitmap downloadBitmap(String url, int width, int height) {
        try {

             String URL  = url.replaceAll(" ", "%20");
            Bitmap bitmap = BitmapFactory.decodeStream((InputStream) new URL(
                    URL).getContent());


            bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
            cache.put(URL, new SoftReference<Bitmap>(bitmap));
            return bitmap;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

     public Bitmap getResizedBitmap(Bitmap bm, int newWidth) {

            int width = bm.getWidth();

            int height = bm.getHeight();

        float aspect = (float)width / height;

        float scaleWidth = newWidth;

        float scaleHeight = scaleWidth / aspect;        // yeah!

        // create a matrix for the manipulation

        Matrix matrix = new Matrix();

        // resize the bit map

        matrix.postScale(scaleWidth / width, scaleHeight / height);

        // recreate the new Bitmap

        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);

            bm.recycle();

            return resizedBitmap;
        }

}

}

检查后,我发现图像 url 不为空。但是,当缓存中没有位图时,ImageLoader 类中 queueJob() 中的处理程序没有运行。我独立测试了相同的代码,并且它有效。无法找出什么是实际问题。

4

0 回答 0