接上,优化滚动的效率
生活随笔
收集整理的這篇文章主要介紹了
接上,优化滚动的效率
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
提高滑動的效率,需要避免UI線程重繪,主要有兩個方法:
ListView滑動停止后才加載可見項
ListView滑動時,取消所有加載項
即,需要增加一個接口:
public class MyAdapter extends BaseAdapter implements AbsListView.OnScrollListener該接口有兩個默認方法: private int mStart, mEnd;private static Stirng[] URLS; //用于保存所有可獲取圖片的地址public void OnScrollStateChanged(AbsListView view, int scrollState){if(scrollState == SCROLL_STATE_IDLE){//加載可見項mImageLoader.loadImage(mStart, mEnd);}else{//停止任務mImageLoader.cancelAllTasks();}}public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int total){mStart = firstVisibleItem;mEnd = firstVisibleItem + visibleItemCount;//第一次顯示時調用if(mFirstIn == true && visibleItemCount > 0){mImageLoader,loadImage(mStart, mEnd);mFirstIn = false;}}
修改后的初始化方法為:
public MyAdapter(Context context, List<MyBean> data, ListView listView){mList = data;mInflater = LayoutInflater.from(context);mImageLoader = new ImageLoader(listView);URLS = new String[data.size()];for(int i =0;i<data.size();i++){URLS[i] = data.get(i).MyIconUrl;}listView.setOnScrollListener(this);}在ImageLoader這個工具類中增加兩條聲明:
private ListView mListView; private Set<MyAsyncTask> mTask; public void loadImage(int start, int end){//用于加載從start到end的所有圖片for(int i = start;i<end;i++){String url = MyAdapter.URLS[i];//從緩存中取出對應圖片Bitmap bitmap = getBitmapFromCache(url);if(bitmap == null){MyAsyncTask task = new MyAsyncTask(url);task.execute(url);mTask.add(task);}else{//緩存中有圖片,則直接使用ImageView imageView = (ImageView)mListView.findViewWithTag(mUrl);//通過tag查到到對應imageViewif(imageView != null && bitmap != null){imageView.setImageBitmap(bitmap);}}} }在繼續增加如下方法:
public void cancelAllTasks(){if(mTask!= null){for(MyAsyncTask task:mTask){task.cancel(false);}} }另外還有一些方法中的參數需要修改,不過都只是適配一下參數而已,具體小細節就不予記錄了。主要完成的就是將顯示圖片交給滑動狀態監聽來觸發,以實現平滑的滾動,將加載圖片的控制權由getView轉移到滑動事件,從而使復雜的ListView也可以實現流暢的異步加載
這樣的編寫程序有很大的弊端,耦合度太高,需要優化某一點小細節,就需要全篇修改,而這不符合面向對象編程的優勢,以后如果有機會我嘗試一下能否改進。
到此為止,基本上就完成了異步加載網絡圖片及相關優化。
異步加載的小總結:
通過異步加載,避免了阻塞UI線程
通過LruCache,將已下載的圖片放入內存中,這是一級緩存,還有將圖片存入硬盤,以便以后更持久的重復使用的二級緩存
通過判斷ListView滑動狀態,決定何時加載圖片
不僅是ListView,任何控件都可以異步加載,且異步加載不僅僅是加載網絡圖片,所有的耗時操作都可以是異步加載,防止阻塞UI線程,提高用戶體驗。
總結
以上是生活随笔為你收集整理的接上,优化滚动的效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接上,进一步优化,LruCache缓存
- 下一篇: 自制Android相机