从 URL 中存储在 Android 中的 JSONString 中的 ImageView 中加载图像

Load Image in ImageView from URL stored in JSONString in Android

我有一个 JSON 字符串,说一个名字和一个 Url 。我需要将名称提取到 TextView 中,并在 ImageView 中提取和显示图像。 以下是上述场景的代码。

 public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}"; 

我需要在我创建的 TextView 中显示名称,并从 url 中获取图像并显示在 Imageview 中。

您可以使用 GSON 库将 json 解析为普通的 Java 对象,然后使用该对象填充 TextView 和 ImageView。如果你不想使用外部库,你可以像这样使用 JSON 类:

JSONObject object = new JSONObject("your strnig");
JSONObject webimages = object.getJSONObject("WebImages");
String imageName = webimages.getString("image_name")
String imageUrl = webimages.getString("imageurl")

使用 Universal Image Loader 加载图片非常快速流畅

首先使用Gson解析Json得到url字符串,然后就可以使用UniversalImageLoader库(异步图片下载,非常好用)https://github.com/nostra13/Android-Universal-Image-Loader

static public DisplayImageOptions options= new DisplayImageOptions.Builder().cacheOnDisk(true).cacheInMemory(true).build();
    imageLoader.displayImage(imgUrl, ivImage, options, new ImageLoadingListener() {

        public void onLoadingStarted(String imageUri, View view) {
            ((ImageView)view).setImageResource(R.drawable.nofoto);
        }

        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            ((ImageView)view).setImageResource(R.drawable.nofoto);
        }

        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

        }

        public void onLoadingCancelled(String imageUri, View view) {
        }

    });

您可以像这样提取图像名称和 url

 public static final String JSON_STRING="{\"WebImages\":{\"Imagename\":\"image_name\",\"imageurl\":http://www.example.com/image/example.png}}"; 
JSONObject jsonObject = new JSONObject(JSON_STRING);
JSONObject webImages = jsonObject.getJSONObject("WebImages");
String imageName = webImages.getString("Imagename");
String imageUrl = webImages.getString("imageurl");

现在,您有了 imageName 和 imageUrl。您可以轻松地设置文本,如 myTextView.setText(imageName)。为了将图像加载到 ImageView,我建议使用 Picasso 库。它非常易于使用。你只需要一行代码,看起来像

Picasso.with(context).load(imageUrl).into(imageView);

你可以这样做。

         public static final String JSON_STRING="{"WebImages":{"Imagename":"image_name","imageurl":http://www.example.com/image/example.png}}";
    private ImageLoader _ImageLoader;

                    try {
            JSONObject _jObj = new JSONObject(JSON_STRING);
            JSONObject _jSubObj = _jObj .getJSONObject("WebImages");
        String _imageName= _jSubObj.getString("Imagename");
YOUR_TEXTVIEW.setText(_imageName);
        String _imageURL= _jSubObj.getString("imageurl");
      _ImageLoader = new ImageLoader(CURRENT_ACTIVITY.this);
       _ImageLoader.DisplayImage(_imageURL,
                        R.drawable.ic_launcher, YOUR_IMAGEVIEW);
                } catch (JSONException e) {
                                        // TODO Auto-generated catch block

                                        e.printStackTrace();
                                    }


    public class ImageLoader {

        MemoryCache memoryCache=new MemoryCache();
        FileCache fileCache;
        private Map<ImageView, String>     imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
        ExecutorService executorService; 

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

        int stub_id = R.drawable.ic_launcher;
        public void DisplayImage(String url, int loader, ImageView imageView)
        {
            try {

                stub_id = loader;
                imageViews.put(imageView, url);
                Bitmap bitmap=memoryCache.get(url);
                if(bitmap!=null)
                    imageView.setImageBitmap(bitmap);
                else
                {
                    queuePhoto(url, imageView);

                    imageView.setImageResource(loader);


                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

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

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

            //from SD cache
            Bitmap b = decodeFile(f);
            if(b!=null)
                return b;

            //from web
            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();
                bitmap = decodeFile(f);
                return bitmap;
            } catch (Exception ex){
                ex.printStackTrace();
                return null;
            }

        }

        public Bitmap getFacebookImage(String userId) {
            // TODO Auto-generated method stub
            Bitmap bitmap = null;

            try {

            HttpGet httpRequest = new HttpGet(
            URI.create(userId));
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = (HttpResponse) httpclient
            .execute(httpRequest);
            HttpEntity entity = response.getEntity();
            BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
            entity);
            bitmap = BitmapFactory
            .decodeStream(bufHttpEntity
            .getContent());
            httpRequest.abort();

            } catch (Exception e) {
            e.printStackTrace();
            }
            return bitmap;
            }

        //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=200;
            //  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=1;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

            } catch (FileNotFoundException e) {

            }catch (Exception 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() {
                if(imageViewReused(photoToLoad))
                    return;
                Bitmap bmp=getBitmap(photoToLoad.url);
                memoryCache.put(photoToLoad.url, bmp);
                if(imageViewReused(photoToLoad))
                    return;
                BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
                Activity a=(Activity)photoToLoad.imageView.getContext();
                a.runOnUiThread(bd);
            }
        }

        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();
        }

    }