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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

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

通過(guò)log我發(fā)現(xiàn)從new newAsynctask(image,url).execute(url);開(kāi)始到加載圖片需要很長(zhǎng)時(shí)間,而thread方法則很快,不是網(wǎng)絡(luò)的問(wèn)題,是什么問(wèn)題呢

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();//獲取最大內(nèi)存
		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){
			//如果沒(méi)有則要去下載
			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實(shí)現(xiàn)中好像沒(méi)有調(diào)用addbitmaptocache

而asynctask你試試用executeOnExecutor();第一個(gè)參數(shù)你提前創(chuàng)建一個(gè)線程池對(duì)象,調(diào)用的時(shí)候傳入。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

不要摸我尾巴喵 提問(wèn)者

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

不要摸我尾巴喵 提問(wèn)者

非常感謝!原來(lái)我每次都new了一個(gè)LruCache
2015-06-11 回復(fù) 有任何疑惑可以回復(fù)我~
#3

orangesweet 回復(fù) 不要摸我尾巴喵 提問(wèn)者

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

怎么解決的?。?/p>

0 回復(fù) 有任何疑惑可以回復(fù)我~

而且發(fā)現(xiàn)并沒(méi)有用到緩存..什么情況

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

0我是既然0

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

舉報(bào)

0/150
提交
取消
Android必學(xué)-異步加載
  • 參與學(xué)習(xí)       50616    人
  • 解答問(wèn)題       333    個(gè)

了解Android中的異步加載處理方法,這是面試問(wèn)的最多的知識(shí)點(diǎn)

進(jìn)入課程

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

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)