loading images from url in json to listview

前端 未结 1 1046
無奈伤痛
無奈伤痛 2021-01-17 05:26

I\'d like to load images from json data which contains the url to these images into a listview,,, the class implementing the json data has the following code:



        
相关标签:
1条回答
  • 2021-01-17 05:49

    u have loading the image json parsing. u have use image loader.

    Imageloader.java class

    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;
    
        public ImageLoader(Context context){
            //Make the background thead low priority. This way it will not affect the UI performance
            photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
    
            //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(),"LazyList");
            else
                cacheDir=context.getCacheDir();
            if(!cacheDir.exists())
                cacheDir.mkdirs();
        }
    
        final int stub_id=R.drawable.stub;
        public void DisplayImage(String url, Activity activity, ImageView imageView)
        {
            if(cache.containsKey(url))
                imageView.setImageBitmap(cache.get(url));
            else
            {
                queuePhoto(url, activity, imageView);
                imageView.setImageResource(stub_id);
            }    
        }
    
        private void queuePhoto(String url, Activity activity, ImageView imageView)
        {
            //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);
            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.
            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;
                DataInputStream input = null;
            //    InputStream is=new URL(url).openStream();
                String auth = android.util.Base64.encodeToString(("devneoauto" + ":" + "2kk0rnpnpvir")
                     .getBytes("UTF-8"), android.util.Base64.NO_WRAP);
    
                HttpClient client = new DefaultHttpClient();
                HttpGet getmethod = new HttpGet(url);
    
                getmethod.addHeader("Authorization", "Basic " + auth);
                getmethod.addHeader("X-ZFWS-Accept", "text/json");
    
                HttpResponse responseGet = client.execute(getmethod);
                HttpEntity resEntityGet = responseGet.getEntity();
    
                if (resEntityGet != null) {
    
                    input = new DataInputStream(responseGet.getEntity().getContent());
    
                }
    
                OutputStream os = new FileOutputStream(f);
                Utils.CopyStream(input, os);
                os.close();
                bitmap = decodeFile(f);
                return bitmap;
            } catch (Exception ex){
               ex.printStackTrace();
               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=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++;
                }
    
                //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 PhotoToLoad(String u, ImageView i){
                url=u; 
                imageView=i;
            }
        }
    
        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);
                            if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){
                                BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
                                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;
            public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
            public void run()
            {
                if(bitmap!=null)
                {
                    imageView.setImageBitmap(bitmap);
                }
               else
                   imageView.setImageResource(R.drawable.stub);
            }
        }
    
        public void clearCache() {
            //clear memory cache
            cache.clear();        
            //clear SD cache
            File[] files=cacheDir.listFiles();
            for(File f:files)
                f.delete();
        }
    
    }
    

    This class use by this method imageloader.DisplayImage(UserSearchResponse.Book_image2.get(position), Book.this, Bookphoto);

    where UsersearchResponse.Book.get(position) use for image url pasrsing for json 
    Book.this for where this Activity in class for example Book is class 
        Bookphoto for where this is ImageView
    

    I m sure this code help u

    0 讨论(0)
提交回复
热议问题