根据url下载一张大小为1M左右的图片,然后用个ImageView显示出来。不爆内存的哦!!!

原创 2012年03月21日 15:49:52
public class NewsletterInfoManager  extends TabManager {

	private static final NewsletterInfoManager INSTANCE = new NewsletterInfoManager();

	private ImageFileCache imageFileCache = new ImageFileCache();
	private Handler mHandler;
	private String newsLetterUrl;
    private Bitmap bitmap = null;

	protected NewsletterInfoManager() {
		mHandler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				if(bitmap!=null && !bitmap.isRecycled()){
					bitmap.recycle();
				}
				bitmap = imageFileCache.getBigImage(newsLetterUrl);
				getDC().loadImage(bitmap);
				getDC().getNewsletterProgressBar().setVisibility(View.INVISIBLE);
			}

		};
	}

	public static NewsletterInfoManager getInstance() {
		return INSTANCE;
	}


	@Override
	protected BaseDC createDC() {
		return new NewsletterDC(context, R.layout.newsletter_info2, this);
	}

	public NewsletterDC getDC() {
		return (NewsletterDC) super.getDC();
	}

	public void setData(Object obj) {
		Map<String,Object> map = (Map<String,Object>)obj;
		newsLetterUrl = (String)map.get("url");
		getDC().getImageView().setImageBitmap(null);

		if(bitmap!=null && !bitmap.isRecycled()){
			bitmap.recycle();
		}
		bitmap = imageFileCache.getBigImage(newsLetterUrl);
		if(bitmap==null){
			//远程加载图片,并保存到sdcard中
			if(Constant.netIsOK){
				getDC().getNewsletterProgressBar().setVisibility(View.VISIBLE);
			}

			startLoadImage();
		}else{

			getDC().loadImage(bitmap);

		}

	}

	private void startLoadImage(){
		new Thread(){
			public void run(){
				byte[] data;
				try {
					data = getImage(newsLetterUrl);
					if(data!=null){
						BitmapFactory.Options opt = new BitmapFactory.Options();
						opt.inPreferredConfig = Bitmap.Config.RGB_565;
						opt.inPurgeable = true;
						opt.inInputShareable = true;
		                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt);// bitmap
		                imageFileCache.saveBmpToSd(bitmap, newsLetterUrl);
		                if(bitmap!=null && !bitmap.isRecycled()){
		                		bitmap.recycle();
		                }
		                mHandler.sendEmptyMessage(0);
		            }
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}.start();
	}
	public void onClicked(int id) {
		super.onClicked(id);
	}

	/**
     * Get image from newwork
     * @param path The path of image
     * @return byte[]
     * @throws Exception
     */
    public byte[] getImage(String path) throws Exception{
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(10 * 1000);
        conn.setRequestMethod("GET");
        InputStream inStream = conn.getInputStream();
        if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
            return readStream(inStream);
        }else{
        		getDC().getNewsletterProgressBar().setVisibility(View.INVISIBLE);
        		Toast.makeText(context, "网络超时,获取图片失败",Toast.LENGTH_SHORT).show();
        }
        return null;
    }

    /**
     * Get data from stream
     * @param inStream
     * @return byte[]
     * @throws Exception
     */
    public static byte[] readStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while( (len=inStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
        }
        outStream.close();
        inStream.close();
        return outStream.toByteArray();
    }
保存图片到sdcard中的方法如下:
	public void saveBmpToSd(Bitmap bm, String url) {
		if (bm == null) {
			//需要保存的是一个空值
			return;
		}
		//判断sdcard上的空间
		if (FREE_SD_SPACE_NEEDED_TO_CACHE >freeSpaceOnSd()) {
			//SD空间不足
			return;
		}
    		String filename =convertUrlToFileName(url);
    		String dir = getDirectory();

    		checkDir(dir);

    		File file = new File(dir +"/" + filename);
    		try {
    		    file.createNewFile();
    			OutputStream outStream = new FileOutputStream(file);
    			if(filename.indexOf("png")>-1){
    				bm.compress(Bitmap.CompressFormat.PNG, 50, outStream);
    			}
    			if(filename.indexOf("jpeg")>-1 || filename.indexOf("jpg")>-1){
    				bm.compress(Bitmap.CompressFormat.JPEG, 50, outStream);
    			}

    			outStream.flush();
    			outStream.close();

    		} catch (FileNotFoundException e) {
    			Log.w("ImageFileCache","FileNotFoundException");
    		} catch (IOException e) {
    			Log.w("ImageFileCache","IOException");
    		}
    }

上面的50代表逼真度,越大,保存后的文件就越大。

从sdcard获取图片的方法:"
public Bitmap getBigImage(final String url) {
		final String path = getDirectory() + "/" + convertUrlToFileName(url);
		File file = new File(path);
		if (file.exists()) {
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inPreferredConfig = Bitmap.Config.RGB_565;
			opts.inPurgeable = true;
			opts.inInputShareable = true;
			Bitmap bmp=BitmapFactory.decodeFile(path,opts);
			if(bmp==null)
			{
				file.delete();
			}else
			{
				updateFileTime(path);
				return bmp;
			}
		}
		return null;
	}




Android中ImageView内存溢出

在使用ImageView加载图片时候,会报内存溢出错误: 操作过程:在应用中调用了相册,将uri加载到imageview中后,当再次进行同样操作就出现如上异常. 原因:读取完资源后没有对资...
  • u014482758
  • u014482758
  • 2015年02月21日 22:35
  • 1089

代码中设置ImageView大小

主页面: package com.xie.app; import android.app.Activity; import android.os.Bundle; import androi...
  • u011004457
  • u011004457
  • 2013年09月06日 00:17
  • 7603

根据图片的宽高比例设置imageView的size

CGFloat itemW = SCREEN_WIDTH; CGFloat itemH = 0; UIImageView * imageView = [[UIImageView all...
  • Jayant_Y
  • Jayant_Y
  • 2016年10月10日 18:44
  • 822

ImageView显示网络图片

直接上代码:   package com.liang.pic; import java.io.IOException; import java.io.InputStream; impor...
  • shouliang52000
  • shouliang52000
  • 2012年06月05日 22:18
  • 2954

通过图片URL下载图片到本地

$imgUrl = 'http://offlintab.firefoxchina.cn/static/img/search/baidu_web.png'; ob_clean(); ob_start...
  • zhaozzeng
  • zhaozzeng
  • 2017年02月09日 14:18
  • 629

有一个1G大小的一个资料,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词

有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词. 首先,我们看到这个题目应该做一下计算,大概的计算,因为大家都清楚的知道1G的...
  • u014686180
  • u014686180
  • 2016年09月02日 11:16
  • 1515

根据url路径获取图片并显示到ListView中

项目开发中我们需要从网络获取图片显示到控件中,很多开源框架如Picasso可以实现图片下载和缓存功能。这里介绍的是一种简易的网络图片获取方式并把它显示到ListView中。根据部分开源代码,我修改并封...
  • LeoLeoHan
  • LeoLeoHan
  • 2015年06月18日 22:22
  • 6889

根据网络图片的size大小设置UIImageView的大小

有时候在设置UIImageView的大小时候需要根据UIimage的长宽比来自动设置,不让图片原比例失真。 如果是从本地获取到的图片,[UIImage imageNamed:@""]; 这样就可...
  • COOL_BEAR_XX
  • COOL_BEAR_XX
  • 2016年08月24日 17:58
  • 8442

cocos2d imageview 设置固定大小 不自适应图片大小

cocos2d imageview 设置固定大小: ignoreContentAdaptWithSize(false)  是否忽略自定义大小, 设为false后, 就不忽略了...
  • highhigh_hi
  • highhigh_hi
  • 2017年05月18日 11:41
  • 1735

Android 网络:使用URL访问网络资源,ImageView,下载到本地

简介: 访问一个网络上的图片,设置在ImageView上显示,并下载到本地 范例效果: 范例代码: acitivity_main.xml: ...
  • u014136472
  • u014136472
  • 2015年08月10日 10:38
  • 1136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据url下载一张大小为1M左右的图片,然后用个ImageView显示出来。不爆内存的哦!!!
举报原因:
原因补充:

(最多只允许输入30个字)