日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接上,优化滚动的效率

發布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接上,优化滚动的效率 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提高滑動的效率,需要避免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線程,提高用戶體驗。

總結

以上是生活随笔為你收集整理的接上,优化滚动的效率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。