用于在活动中显示图像的Imageloader

时间:2013-09-30 04:42:52

标签: java android json

检查此网址我正在使用 :: http://54.218.73.244:7006/DescriptionSortedRating/

图像将使用restaurantIMAGE

附加JSON输出的相对路径

EX ::

http://54.218.73.244:7006/CopperChimney1.jpg

我正在使用JSON的restaurantIMAGE

{
  "restaurants": [
    {
      "restaurantID": 4,
      "restaurantNAME": "CopperChimney1",
      "restaurantIMAGE": "MarkBoulevard1.jpg",
      "restaurantDISTANCE": 15,
      "restaurantTYPE": "Indian",
      "restaurantRATING": 1,
      "restaurantPrice": 11,
      "restaurantTime": "9am t0 8pm"
    },
    {
      "restaurantID": 1,
      "restaurantNAME": "CopperChimney",
      "restaurantIMAGE": "CopperChimney.png",
      "restaurantDISTANCE": 5,
      "restaurantTYPE": "Indian",
      "restaurantRATING": 3,
      "restaurantPrice": 20,
      "restaurantTime": "8pm to 11pm"
    },

我正在使用IMAGE LOADER

ImageLoader.java

    public class ImageLoader {

        MemoryCache memoryCache = new MemoryCache();
        FileCache fileCache;
        private Map<ImageView, String> imageViews = Collections
                .synchronizedMap(new WeakHashMap<ImageView, String>());
        ExecutorService executorService;
        // Handler to display images in UI thread
        Handler handler = new Handler();

        public ImageLoader(Context context) {
            fileCache = new FileCache(context);
            executorService = Executors.newFixedThreadPool(5);
        }

        final int stub_id = R.drawable.temp_img;

        public void DisplayImage(String url, ImageView imageView) {
            imageViews.put(imageView, url);
            Bitmap bitmap = memoryCache.get(url);
            if (bitmap != null)
                imageView.setImageBitmap(bitmap);
            else {
                queuePhoto(url, imageView);
                imageView.setImageResource(stub_id);
            }
        }

        private void queuePhoto(String url, ImageView imageView) {
            PhotoToLoad p = new PhotoToLoad(url, imageView);
            executorService.submit(new PhotosLoader(p));
        }

        private Bitmap getBitmap(String url) {
            File f = fileCache.getFile(url);

            Bitmap b = decodeFile(f);
            if (b != null)
                return b;

            // Download Images from the Internet
            try {
                Bitmap bitmap = null;
                URL imageUrl = new URL(url);
                HttpURLConnection conn = (HttpURLConnection) imageUrl
                        .openConnection();
                conn.setConnectTimeout(30000);
                conn.setReadTimeout(30000);
                conn.setInstanceFollowRedirects(true);
                InputStream is = conn.getInputStream();
                OutputStream os = new FileOutputStream(f);
                Utils.CopyStream(is, os);
                os.close();
                conn.disconnect();
                bitmap = decodeFile(f);
                return bitmap;
            } catch (Throwable ex) {
                ex.printStackTrace();
                if (ex instanceof OutOfMemoryError)
                    memoryCache.clear();
                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;
                FileInputStream stream1 = new FileInputStream(f);
                BitmapFactory.decodeStream(stream1, null, o);
                stream1.close();

                // Find the correct scale value. It should be the power of 2.
                // Recommended Size 512
                final int REQUIRED_SIZE = 70;
                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;
                FileInputStream stream2 = new FileInputStream(f);
                Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
                stream2.close();
                return bitmap;
            } catch (FileNotFoundException e) {
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

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

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

        class PhotosLoader implements Runnable {
            PhotoToLoad photoToLoad;

            PhotosLoader(PhotoToLoad photoToLoad) {
                this.photoToLoad = photoToLoad;
            }

            @Override
            public void run() {
                try {
                    if (imageViewReused(photoToLoad))
                        return;
                    Bitmap bmp = getBitmap(photoToLoad.url);
                    memoryCache.put(photoToLoad.url, bmp);
                    if (imageViewReused(photoToLoad))
                        return;
                    BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
                    handler.post(bd);
                } catch (Throwable th) {
                    th.printStackTrace();
                }
            }
        }

        boolean imageViewReused(PhotoToLoad photoToLoad) {
            String tag = imageViews.get(photoToLoad.imageView);
            if (tag == null || !tag.equals(photoToLoad.url))
                return true;
            return false;
        }

        // Used to display bitmap in the UI thread
        class BitmapDisplayer implements Runnable {
            Bitmap bitmap;
            PhotoToLoad photoToLoad;

            public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
                bitmap = b;
                photoToLoad = p;
            }

            public void run() {
                if (imageViewReused(photoToLoad))
                    return;
                if (bitmap != null)
                    photoToLoad.imageView.setImageBitmap(bitmap);
                else
                    photoToLoad.imageView.setImageResource(stub_id);
            }
        }

        public void clearCache() {
            memoryCache.clear();
            fileCache.clear();
        }

    }

Utils,FileCache,MemoryCache java文件也在那里

RestaurantDescPhotos.java

public class RestaurantDescPhotos extends Activity {
    // url to make request

    private static String url = "http://54.218.73.244:7006/DescriptionSortedRating/";

    String restaurant_name, cc_res;
    ProgressDialog progressDialog;
    JSONObject jsonObject;
    JSONArray first_array;
    ImageLoader imageLoader;
    TextView textView;
    TextView text;

    private SparseArray<String> imagesMap = new SparseArray<String>();

    ArrayList<HashMap<String, String>> list_of_images = new ArrayList<HashMap<String, String>>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.restaurant_desc_photos);

        imageLoader=new  ImageLoader(RestaurantDescPhotos.this);

        progressDialog = new ProgressDialog(RestaurantDescPhotos.this);
        new ParsingAsync().execute();
    }

    private class ParsingAsync extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(RestaurantDescPhotos.this, "",
                    "Please Wait", true, false);

        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            String _response = null;
            try {
                HttpClient httpclient = new DefaultHttpClient();
                httpclient.getParams().setParameter(
                        CoreProtocolPNames.PROTOCOL_VERSION,
                        HttpVersion.HTTP_1_1);



                HttpGet request = new HttpGet(url);
                HttpResponse response = httpclient.execute(request);
                HttpEntity resEntity = response.getEntity();
                _response = EntityUtils.toString(resEntity);

                jsonObject = new JSONObject(_response);
                first_array = jsonObject.getJSONArray("restaurants");

            } catch (JSONException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;

        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            progressDialog.dismiss();

            // TextView timedisplay=(TextView)
            // findViewById(R.id.RestaurantTimeID);

            for (int i = 0; i < first_array.length(); i++) {
                try {
                    JSONObject detail_obj = first_array.getJSONObject(i);

                    HashMap<String, String> map_for_images = new HashMap<String, String>();

                    int id = detail_obj.getInt("_id");
                    String IMAGES = "http://54.218.73.244:7006/"+detail_obj.getString("restaurantIMAGE");

                    map_for_images.put("Starters", IMAGES);

                    list_of_images.add(map_for_images);


                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }


            ImageView imageView = (ImageView) findViewById(R.id.DISP_IMG);

            imageLoader.DisplayImage(url, imageView);


        }
    }
}

我正面临使用图像加载器将图像设置到图像视图上的问题

RestaurantDescPhotos.java存在一些问题......我无法弄清楚

任何想法

1 个答案:

答案 0 :(得分:0)

url内容不是有效的图片网址:

imageLoader.DisplayImage(url, imageView);

我尝试了一个固定的图片网址,并且图片已成功加载:

String path = "http://54.218.73.244:7006/CopperChimney1.jpg";
imageLoader.DisplayImage(path, imageView);