我的图片没有显示从网址正确加载

时间:2014-08-19 05:51:58

标签: android url image-loading

我正在从网址加载图片...它没有显示第一次...当我再次点击相同然后图像正在显示...你能帮我吗......为什么图像没有第一次加载

提前致谢

  ImageLoader imgLoader = new ImageLoader(getApplicationContext(),
                UserByIdProfile.this);


        //

        image.setTag(image_url);
  imgLoader.DisplayImage(image_url, UserByIdProfile.this, image);

这是我的图像加载器类

public class ImageLoader {


    // the simplest in-memory cache implementation. This should be replaced with
    // something like SoftReference or BitmapOptions.inPurgeable(since 1.6)
    private HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>();

    private File cacheDir;

    static ArrayList<String> img_path = new ArrayList<String>();

    static String sd_card_folder_name = "ImageLoader";

    static int width;
    Context mContext;

    public ImageLoader(Context context, Activity acc) {
        mContext = context;
        // Make the background thead low priority. This way it will not affect
        // the UI performance
        photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1);

        DisplayMetrics displaymetrics = new DisplayMetrics();
        acc.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        width = displaymetrics.widthPixels;
        Log.d("width", "width = " + width);

        cache.clear();

        img_path = new ArrayList<String>();

        // Find the dir to save cached images
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED))
            cacheDir = new File(android.os.Environment
                    .getExternalStorageDirectory(), sd_card_folder_name);
        else
            cacheDir = context.getCacheDir();
        if (!cacheDir.exists())
            cacheDir.mkdirs();

    }

    final int stub_id = R.drawable.loader;

    public void DisplayImage(String url, Activity activity, ImageView imageView) {
        try {
            String filename = String.valueOf(url.hashCode());

            File[] file_array = cacheDir.listFiles();

            for (int i = 0; i < file_array.length; i++) {
                img_path.add(file_array[i].getName());
            }

            if (img_path.contains(filename)) {
                imageView.setImageBitmap(BitmapFactory
                        .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                + filename));
            } else {
                if (cache.containsKey(url)) {
                    imageView.setImageBitmap(cache.get(url));
                } else {
                    queuePhoto(url, activity, imageView, filename);
                    imageView.setImageResource(stub_id);
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    private void queuePhoto(String url, Activity activity, ImageView imageView, String _name) {
        // This ImageView may be used for other images before. So there may be
        // some old tasks in the queue. We need to discard them.
        photosQueue.Clean(imageView);
        PhotoToLoad p = new PhotoToLoad(url, imageView, _name);
        synchronized (photosQueue.photosToLoad) {
            photosQueue.photosToLoad.push(p);
            photosQueue.photosToLoad.notifyAll();
        }

        // start thread if it's not started yet
        if (photoLoaderThread.getState() == Thread.State.NEW)
            photoLoaderThread.start();
    }

    private Bitmap getBitmap(String url) {
        // I identify images by hashcode. Not a perfect solution, good for the
        // demo.

        if (url != null && !(url.equals(""))) {
            String filename = String.valueOf(url.hashCode());
            File f = new File(cacheDir, filename);

            /*
             * // from SD cache Bitmap b = decodeFile(f); if (b != null) return
             * b;
             */
            // from web
            try {
                Bitmap bitmap = null;
                InputStream is = new URL(url).openStream();
                OutputStream os = new FileOutputStream(f);
                Utils.CopyStream(is, os);
                os.close();
                bitmap = decodeFile(f);
                return bitmap;
            } catch (Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }
        return null;
    }

    // decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f) {
        try {
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // Find the correct scale value. It should be the power of 2.
             final int REQUIRED_SIZE=300;
                int width_tmp=o.outWidth, height_tmp=o.outHeight;
                int scale=1;
                while(true){
                    if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                        break;
                    width_tmp/=2;
                    height_tmp/=2;
                    scale*=2;
                }
            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
        }
        return null;
    }

    // Task for the queue
    private class PhotoToLoad {
        public String url;
        public ImageView imageView;
        public String _name;

        public PhotoToLoad(String u, ImageView i, String n) {
            url = u;
            imageView = i;
            _name = n;
        }
    }

    PhotosQueue photosQueue = new PhotosQueue();

    public void stopThread() {
        photoLoaderThread.interrupt();
    }

    // stores list of photos to download
    class PhotosQueue {
        private Stack<PhotoToLoad> photosToLoad = new Stack<PhotoToLoad>();

        // removes all instances of this ImageView
        public void Clean(ImageView image) {
            for (int j = 0; j < photosToLoad.size();) {
                if (photosToLoad.get(j).imageView == image)
                    photosToLoad.remove(j);
                else
                    ++j;
            }
        }
    }

    class PhotosLoader extends Thread {
        public void run() {
            try {
                while (true) {
                    // thread waits until there are any images to load in the
                    // queue
                    if (photosQueue.photosToLoad.size() == 0)
                        synchronized (photosQueue.photosToLoad) {
                            photosQueue.photosToLoad.wait();
                        }
                    if (photosQueue.photosToLoad.size() != 0) {
                        PhotoToLoad photoToLoad;
                        synchronized (photosQueue.photosToLoad) {
                            photoToLoad = photosQueue.photosToLoad.pop();
                        }
                        Bitmap bmp = getBitmap(photoToLoad.url);
                        cache.put(photoToLoad.url, bmp);
                        Object tag = photoToLoad.imageView.getTag();
                        String FileName = photoToLoad._name;
                        if (FileName != null
                                && ((String) FileName).equals(photoToLoad._name)) {
                            BitmapDisplayer bd = new BitmapDisplayer(bmp,
                                    photoToLoad.imageView, FileName);
                            Activity a = (Activity) photoToLoad.imageView
                                    .getContext();
                            a.runOnUiThread(bd);
                        }
                    }
                    if (Thread.interrupted())
                        break;
                }
            } catch (InterruptedException e) {
                // allow thread to exit
            }
        }
    }

    PhotosLoader photoLoaderThread = new PhotosLoader();

    // Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable {
        Bitmap bitmap;
        ImageView imageView;
        String file_name;

        public BitmapDisplayer(Bitmap b, ImageView i, String _name) {
            bitmap = b;
            imageView = i;
            file_name = _name;
        }

        public void run() {
            if (bitmap != null) {

                load_full_image(imageView, file_name, bitmap);

            } else
                imageView.setImageResource(stub_id);
        }
    }

    private Runnable mMyRunnable = new Runnable() {
        @Override
        public void run() {

        }
    };

    public void load_full_image(ImageView img, String _name, Bitmap btmp) {
        img_path = new ArrayList<String>();

        File[] file_array = cacheDir.listFiles();
        for (int i = 0; i < file_array.length; i++) {
            img_path.add(file_array[i].getName());
        }

        if (img_path.contains(_name)) {
            Drawable d = new BitmapDrawable(mContext.getResources(),BitmapFactory
                                .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                        + _name));
            //sssss img.setBackground(d);
        } else {

            Drawable d = new BitmapDrawable(mContext.getResources(),btmp);

           // img.setBackground(d);
        }
    }

    public void clearCache() {
        // clear memory cache
        cache.clear();

        // clear SD cache
        File[] files = cacheDir.listFiles();
        for (File f : files)
            f.delete();
    }

}

1 个答案:

答案 0 :(得分:0)

我认为您评论了img.setBackground。

public void load_full_image(ImageView img, String _name, Bitmap btmp) {
    img_path = new ArrayList<String>();

    File[] file_array = cacheDir.listFiles();
    for (int i = 0; i < file_array.length; i++) {
        img_path.add(file_array[i].getName());
    }

    if (img_path.contains(_name)) {
        Drawable d = new BitmapDrawable(mContext.getResources(),BitmapFactory
                            .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                    + _name));
        //sssss img.setBackground(d);  
    } else {

        Drawable d = new BitmapDrawable(mContext.getResources(),btmp);

       // img.setBackground(d);
    }
}