2016-01-04 31 views
0

从Android中,我使用HttpURLConnection,InputStream和xmlFactoryObject来使用REST Web服务。在web服务响应xml中提供的路径在android上显示图像

<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<employees> 
    <employee> 
     <empId>123</empId> 
     <empName>asd</empName> 
     <ext>asdas</ext> 
     <location>asdasd</location> 
     <photoPath>D:\PhotoPath\asd.gif</photoPath> 
    </employee> 
</employees> 

解析上述响应XML后,我接收photopath为d:\ PhotoPath \ asd.gif如下面提到

响应XML从WebService的我收到响应。

如何在Android Image View中显示此图像?由于所提到的photopath与我的Web服务托管的服务器有关,它是否与Service有关?如果是的话如何处理呢?

+0

怎么办你在'D:\ PhotoPath \ asd.gif'中用'D'表示 – Jas

回答

0

您在响应中获得的上述路径是错误的。您将不得不在服务器路径中创建一个虚拟目录。所以你的图片路径会出现如下内容:www.yourdomain.com/PhotoPath/asd.gif。然后,您可以使用一些图书馆像AQuery

显示在imageview的这一形象
0

你可以简单地使用

URL url = new URL("your image url"); 
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
imageView.setImageBitmap(bmp); 

其中imageView是您的ImageView 另外您也可以使用任何库一样Picasso

0
Pass url and imageview object to displayImage method.It will load images by caching it.So next time you will not need to download same image 
package com.fudiyo.images; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.Collections; 
import java.util.Map; 
import java.util.WeakHashMap; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Handler; 
import android.widget.ImageView; 

import com.fudiyo.R; 
import com.fudiyo.config.Config; 
import com.fudiyo.twitter.ScaleBitmap; 

public class ImageLoader { 

    // Initialize MemoryCache 
    MemoryCache memoryCache = new MemoryCache(); 

    FileCache fileCache; 

    Context C; 

    // Create Map (collection) to store image and image url in key value pair 
    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) { 

     C = context; 
     fileCache = new FileCache(context); 

     // Creates a thread pool that reuses a fixed number of 
     // threads operating off a shared unbounded queue. 
     executorService = Executors.newFixedThreadPool(5); 

    } 

    // default image show in list (Before online image download) 
    final int stub_id = R.drawable.fudiyo_default; 

    public void DisplayImage(String url, ImageView imageView, Context context, 
      boolean header_flag) { 

     Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), 
       R.drawable.fudiyo_default); 

     // Store image and url in Map 
     imageViews.put(imageView, url); 

     // Check image is stored in MemoryCache Map or not (see 
     // MemoryCache.java) 
     Bitmap bitmap = memoryCache.get(url); 

     if (bitmap != null) { 
      // if image is stored in MemoryCache Map then 
      // Show image in listview row 
      Bitmap b = ScaleBitmap 
        .getScaledBitmap(context, bitmap, header_flag); 
      imageView.setImageBitmap(b); 

     } else { 
      // queue Photo to download from url 
      queuePhoto(url, imageView, header_flag); 

      // Before downloading image show default image 
      imageView.setImageBitmap(ScaleBitmap 
        .getScaledBitmap(context, largeIcon, header_flag)); 

     } 
    } 
    public void DisplayRoundedImage(String url, ImageView imageView, Context context, 
      boolean header_flag) { 

     Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), 
       R.drawable.defaultuserphoto); 

     // Store image and url in Map 
     imageViews.put(imageView, url); 

     // Check image is stored in MemoryCache Map or not (see 
     // MemoryCache.java) 
     Bitmap bitmap = memoryCache.get(url); 

     if (bitmap != null) { 
      // if image is stored in MemoryCache Map then 
      // Show image in listview row 
      Bitmap b = ScaleBitmap 
        .getScaledRoundedBitmap(context, bitmap, header_flag); 
      imageView.setImageBitmap(b); 

     } else { 
      // queue Photo to download from url 
      queuePhoto(url, imageView, header_flag); 

      // Before downloading image show default image 
      imageView.setImageBitmap(ScaleBitmap 
        .getScaledRoundedBitmap(context, largeIcon, header_flag)); 

     } 
    } 


    private void queuePhoto(String url, ImageView imageView, boolean header_flag) { 
     // Store image and url in PhotoToLoad object 
     PhotoToLoad p = new PhotoToLoad(url, imageView, header_flag); 

     // pass PhotoToLoad object to PhotosLoader runnable class 
     // and submit PhotosLoader runnable to executers to run runnable 
     // Submits a PhotosLoader runnable task for execution 

     executorService.submit(new PhotosLoader(p)); 
    } 

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

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

    class PhotosLoader implements Runnable { 
     PhotoToLoad photoToLoad; 

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

     @Override 
     public void run() { 
      try { 
       // Check if image already downloaded 
       if (imageViewReused(photoToLoad)) 
        return; 
       // download image from web url 
       Bitmap bmp = getBitmap(photoToLoad.url); 

       // set image data in Memory Cache 
       memoryCache.put(photoToLoad.url, bmp); 

       if (imageViewReused(photoToLoad)) 
        return; 

       // Get bitmap to display 
       BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad); 

       // Causes the Runnable bd (BitmapDisplayer) to be added to the 
       // message queue. 
       // The runnable will be run on the thread to which this handler 
       // is attached. 
       // BitmapDisplayer run method will call 
       handler.post(bd); 

      } catch (Throwable th) { 
       // th.printStackTrace(); 
      } 
     } 
    } 

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

     // from SD cache 
     // CHECK : if trying to decode file which not exist in cache return null 
     Bitmap b = decodeFile(f); 
     if (b != null) 
      return b; 

     // Download image file from web 
     try { 

      // // download the image 
      Bitmap bitmap = null; 

      URL imageURL = null; 
      try { 

       imageURL = new URL(
         Config.WEB_URL+"/ServeBlob?id=" + url); 

       HttpURLConnection connection = (HttpURLConnection) imageURL 
         .openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 
       // if(!(new File(imageURL.toString())).exists()) 
       // { 
       // imageURL=new URL(""); 
       // } 
       InputStream inputStream = connection.getInputStream(); 

       // Constructs a new FileOutputStream that writes to 
       // file 
       // if file not exist then it will create file 
       OutputStream os = new FileOutputStream(f); 

       // See Utils class CopyStream method 
       // It will each pixel from input stream and 
       // write pixels to output stream (file) 
       Utils.CopyStream(inputStream, os); 

       os.close(); 

       BitmapFactory.Options options = new BitmapFactory.Options(); 
       options.inSampleSize = 8; 

       bitmap = BitmapFactory.decodeStream(inputStream, null, options); 

      } catch (IOException e) { 

       // e.printStackTrace(); 
      } 

      // Now file created and going to resize file with defined height 
      // Decodes image and scales it to reduce memory consumption 
      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. 

      // Set width/height of recreated image 
      final int REQUIRED_SIZE = 85; 

      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 current scale values 
      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; 
    } 

    boolean imageViewReused(PhotoToLoad photoToLoad) { 

     String tag = imageViews.get(photoToLoad.imageView); 
     // Check url is already exist in imageViews MAP 
     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; 

      // Show bitmap on UI 
      if (bitmap != null) { 
       photoToLoad.imageView.setImageBitmap(ScaleBitmap 
         .getScaledBitmap(C, bitmap, photoToLoad.b)); 
      } else { 

      } 
      // photoToLoad.imageView.setImageResource(stub_id); 

     } 
    } 

    public void clearCache() { 
     // Clear cache directory downloaded images and stored data in maps 
     memoryCache.clear(); 
     fileCache.clear(); 
    } 

} 







package com.fudiyo.images; 

import java.util.Collections; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import android.graphics.Bitmap; 
import android.util.Log; 

public class MemoryCache { 

    private static final String TAG = "MemoryCache"; 

    //Last argument true for LRU ordering 
    private Map<String, Bitmap> cache = Collections.synchronizedMap(
      new LinkedHashMap<String, Bitmap>(10,1.5f,true)); 

    //current allocated size 
    private long size=0; 

    //max memory cache folder used to download images in bytes 
    private long limit = 1000000; 

    public MemoryCache(){ 

     //use 25% of available heap size 
     setLimit(Runtime.getRuntime().maxMemory()/4); 
    } 

    public void setLimit(long new_limit){ 

     limit=new_limit; 
     Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB"); 
    } 

    public Bitmap get(String id){ 
     try{ 
      if(!cache.containsKey(id)) 
       return null; 
      //NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78 
      return cache.get(id); 
     }catch(NullPointerException ex){ 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

    public void put(String id, Bitmap bitmap){ 
     try{ 
      if(cache.containsKey(id)) 
       size-=getSizeInBytes(cache.get(id)); 
      cache.put(id, bitmap); 
      size+=getSizeInBytes(bitmap); 
      checkSize(); 
     }catch(Throwable th){ 
      th.printStackTrace(); 
     } 
    } 

    private void checkSize() { 
     Log.i(TAG, "cache size="+size+" length="+cache.size()); 
     if(size>limit){ 
      Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();//least recently accessed item will be the first one iterated 
      while(iter.hasNext()){ 
       Entry<String, Bitmap> entry=iter.next(); 
       size-=getSizeInBytes(entry.getValue()); 
       iter.remove(); 
       if(size<=limit) 
        break; 
      } 
      Log.i(TAG, "Clean cache. New size "+cache.size()); 
     } 
    } 

    public void clear() { 
     try{ 
      //NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78 
      cache.clear(); 
      size=0; 
     }catch(NullPointerException ex){ 
      ex.printStackTrace(); 
     } 
    } 

    long getSizeInBytes(Bitmap bitmap) { 
     if(bitmap==null) 
      return 0; 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    } 
} 












package com.fudiyo.images; 

import java.io.InputStream; 
import java.io.OutputStream; 

public class Utils { 
    public static void CopyStream(InputStream is, OutputStream os) 
    { 
     final int buffer_size=1024; 
     try 
     { 

      byte[] bytes=new byte[buffer_size]; 
      for(;;) 
      { 
       //Read byte from input stream 

       int count=is.read(bytes, 0, buffer_size); 
       if(count==-1) 
        break; 

       //Write byte from output stream 
       os.write(bytes, 0, count); 
      } 
     } 
     catch(Exception ex){} 
    } 
} 
相关问题