第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

使用Asynctask的方法加載圖片非常的慢

通過log我發(fā)現從new newAsynctask(image,url).execute(url);開始到加載圖片需要很長時間,而thread方法則很快,不是網絡的問題,是什么問題呢

package?com.example.asynvtask_learn;

import?java.io.BufferedInputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.net.HttpURLConnection;
import?java.net.MalformedURLException;
import?java.net.URL;

import?android.graphics.Bitmap;
import?android.graphics.BitmapFactory;
import?android.os.AsyncTask;
import?android.os.Handler;
import?android.os.Message;
import?android.support.v4.util.LruCache;
import?android.util.Log;
import?android.widget.ImageView;

class?Imageload{
	private?ImageView?image;
	private?String?url;
	private?LruCache<String,?Bitmap>?mcache;//用于緩存
	private?Handler?mhandler?=?new?Handler(){
		public?void?handleMessage(Message?msg)?{
			if(image.getTag().equals(url)){
				image.setImageBitmap((Bitmap)?msg.obj
			);}
		};
	};
	
	public?Imageload()?{
		//?TODO?Auto-generated?constructor?stub
		//緩存
		int?maxMemory=(int)?Runtime.getRuntime().maxMemory();//獲取最大內存
		int?Memorysize=maxMemory/4;
		mcache=new?LruCache<String,?Bitmap>(Memorysize){
			@Override
			protected?int?sizeOf(String?key,?Bitmap?value)?{
				//?TODO?Auto-generated?method?stub
				return?value.getByteCount();//Bitmap的大小
			}
		};
		//緩存
	}
	//加入緩存
	public?void?addbitmaptocache(String?url,Bitmap?bitmap){
		if(getbitmapfromcache(url)==null){
			mcache.put(url,?bitmap);
		}
	}
	//獲取緩存
	public?Bitmap?getbitmapfromcache(String?url)?{
		Bitmap?mbitmap=mcache.get(url);
		return?mbitmap;
	}
	
	public?Bitmap?getbitmap(String?surl){
		Bitmap?bitmap?=?null;
		InputStream?is?=?null;
		try?{
			URL?url=new?URL(surl);
			HttpURLConnection?htc=(HttpURLConnection)?url.openConnection();
			is=new?BufferedInputStream(htc.getInputStream());
			bitmap=BitmapFactory.decodeStream(is);
			htc.disconnect();
		}?catch?(MalformedURLException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}?catch?(IOException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}finally{
			try?{
				is.close();
			}?catch?(IOException?e)?{
				//?TODO?Auto-generated?catch?block
				e.printStackTrace();
			}
		}
		return?bitmap;
		
	}
	
	//thread方法
	public?void?showimagebythread(ImageView?image,final?String?url){
		this.image=image;
		this.url=url;
		new?Thread(){
			@Override
			public?void?run()?{
				//?TODO?Auto-generated?method?stub
				super.run();
				Bitmap?bt=getbitmap(url);
				Message?message?=?Message.obtain();
				message.obj=bt;
				mhandler.sendMessage(message);
				
			}
		}.start();
	}
	//asynctask方法
	public?void?showimagebyasynctask(ImageView?image,String?url){
		Bitmap?bitmap=getbitmapfromcache(url);//緩存中取出圖片
		Log.i("info",?"取出了緩存");
		if(bitmap==null){
			//如果沒有則要去下載
			new?newAsynctask(image,url).execute(url);
			Log.i("info",?"下載");
		}else{
			image.setImageBitmap(bitmap);
			Log.i("info",?"緩存加載");
		}
		
	}
	
	class?newAsynctask?extends?AsyncTask<String,?Void,?Bitmap>{
		String?url;
		ImageView?imageView;
		public?newAsynctask(ImageView?imageView,String?url)?{
			//?TODO?Auto-generated?constructor?stub
			this.imageView=imageView;
			this.url=url;
		}
		
		@Override
		protected?Bitmap?doInBackground(String...?params)?{
			//?TODO?Auto-generated?method?stub
			String?murl=params[0];
			Bitmap?bitmap=getbitmap(murl);
			if(bitmap!=null){
				//加入緩存
				addbitmaptocache(murl,bitmap);
				Log.i("info",?"加入了緩存");
			}
			return?bitmap;
//			return?getbitmap(params[0]);
		}
		
		@Override
		protected?void?onPostExecute(Bitmap?result)?{
			//?TODO?Auto-generated?method?stub
			super.onPostExecute(result);
			if(imageView.getTag().equals(url)){
				imageView.setImageBitmap(result);
				Log.i("info",?"下載加載");
			}
		}
	}
}


正在回答

3 回答

你的Thread實現中好像沒有調用addbitmaptocache

而asynctask你試試用executeOnExecutor();第一個參數你提前創(chuàng)建一個線程池對象,調用的時候傳入。

0 回復 有任何疑惑可以回復我~
#1

不要摸我尾巴喵 提問者

用你的方法果然快了超多,可是為什么沒有用到緩存我還是沒找到原因...
2015-06-11 回復 有任何疑惑可以回復我~
#2

不要摸我尾巴喵 提問者

非常感謝!原來我每次都new了一個LruCache
2015-06-11 回復 有任何疑惑可以回復我~
#3

orangesweet 回復 不要摸我尾巴喵 提問者

恩,曾經也用execute方法,因為cpu很忙,等10秒執(zhí)行,當時不知道為什么,后來才知execute方法執(zhí)行的策略就是這樣,這涉及源碼了,我沒研究過,知道大概。executeOnExecutor從線程池中獲取線程執(zhí)行方法,優(yōu)先級比較高。 按你說的你應該是每次讀圖都創(chuàng)建ImageLoad對象,那你LruCache最好弄成單例的,可以在Application中創(chuàng)建?;蛘逫mageLoad弄成單例,把每個imageview放到message中。網絡讀圖有很多框架,volley,universImageLoader等等,實際使用這些框架很方便,不用自己寫,這例子當學習AsyncTask就行了
2015-06-12 回復 有任何疑惑可以回復我~

怎么解決的啊?

0 回復 有任何疑惑可以回復我~

而且發(fā)現并沒有用到緩存..什么情況

0 回復 有任何疑惑可以回復我~
#1

0我是既然0

仔細檢查下方法的調用,有可能你把getBitmapfrommCaches寫成了getBitmapFromURL之類的
2015-07-26 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Android必學-異步加載
  • 參與學習       50617    人
  • 解答問題       326    個

了解Android中的異步加載處理方法,這是面試問的最多的知識點

進入課程

使用Asynctask的方法加載圖片非常的慢

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號