使用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",?"下載加載"); } } } }
2015-06-11
你的Thread實現中好像沒有調用addbitmaptocache
而asynctask你試試用executeOnExecutor();第一個參數你提前創(chuàng)建一個線程池對象,調用的時候傳入。
2015-11-05
怎么解決的啊?
2015-06-10
而且發(fā)現并沒有用到緩存..什么情況