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

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

Android必學(xué)-異步加載

難度中級
時(shí)長 1小時(shí)57分
學(xué)習(xí)人數(shù)
綜合評分9.70
220人評價(jià) 查看評價(jià)
9.9 內(nèi)容實(shí)用
9.7 簡潔易懂
9.5 邏輯清晰
  • 多看幾次 會有不同的收獲
    查看全部
    0 采集 收起 來源:總結(jié)

    2017-04-08

  • LruCahce本質(zhì)是LinkedHashmap
    查看全部
    0 采集 收起 來源:LruCache緩存(下)

    2017-03-23

  • Android 異步加載的總結(jié) 1. 通過異步加載,避免阻塞UI線程,從而實(shí)現(xiàn)了網(wǎng)絡(luò)的異步訪問。這是基礎(chǔ),也是 Android 要求我們這么做的。 2. 通過 LruCache,將已經(jīng)下載的圖片放到內(nèi)存中,以一個(gè)緩存避免多次重復(fù)的下載,提高用戶的體驗(yàn)。當(dāng)然,這里只介紹了內(nèi)存緩存,我們還可以使用 DiskLruCache ,將內(nèi)存中的圖片保存到硬盤中,保存到存儲器中,做為一個(gè)持久化的緩存,這也稱作“二級緩存”。而內(nèi)存緩存便叫做“一級緩存”。 3. 通過判斷 ListView 的滑動狀態(tài),決定什么時(shí)候該加載圖片,什么時(shí)候不該加載圖片,而讓ListView平滑地去滾動。在這一點(diǎn)上我們是通過對 ListView 的滑動狀態(tài)的監(jiān)聽,去實(shí)現(xiàn)這樣的操作,將加載圖片的控制權(quán)由 getView() 轉(zhuǎn)移到我們的滑動事件,從而讓復(fù)雜的 ListView 也能實(shí)現(xiàn)流暢的異步加載。 4. 不僅僅是 ListView ,任何控件都可以使用異步加載,這里以 ListView 作為例子的原因是因?yàn)樗容^常用。異步加載不僅僅用于獲取網(wǎng)絡(luò)圖片,所有的耗時(shí)操作我們都可以認(rèn)為是異步加載,通過異步的方式,去將這些耗時(shí)操作與主線程分開,從而提升用戶體驗(yàn),這也是異步加載的核心所在。
    查看全部
    1 采集 收起 來源:總結(jié)

    2017-03-22

  • 上節(jié)課中我們看到圖片最初并沒有加載,需要滑動才加載,因?yàn)槲覀儼鸭虞d圖片的控制權(quán)交給了onScrollStateChanged ,也就是說只有滑動狀態(tài)改變,才觸發(fā)加載任務(wù)。那么預(yù)加載的問題該如何解決呢?我們可以把啟動時(shí)的圖片加載交給onScroll(因?yàn)樗恢北徽{(diào)用)去執(zhí)行。步驟: 1. 在NewsAdapter中設(shè)置一個(gè)布爾變量,判斷當(dāng)前是不是第一次啟動:private boolean mFirstIn; 在初始化的時(shí)候(就在構(gòu)造方法里面)把 mFirstIn設(shè)置為true。 2. 在 onScroll() 中進(jìn)行判斷: if( mFirstIn && visibleItemCount>0){ mImageLoader.loadImages(mStart,mEnd); mFirstIn = false; } 為什么要寫visibleItemCount>0?因?yàn)?onScroll()會被多次調(diào)用,而初始化調(diào)用的時(shí)候visibleItemCount是等于0的,這時(shí)候 Item 還沒有被加載,所以我們要將這個(gè)過程跳過去。這就是為什么我們這里要使用兩個(gè)條件:當(dāng)前列表是第一次顯示、而且 ListView 的 Item 已經(jīng)畫出來了。
    查看全部
  • 步驟: 1.在 NewsAdaper 中修改 onScrollStateChanged(): 如果停止?jié)L動則加載可見項(xiàng):mImageLoader.loadImages(mStart,mEnd); 如果滾動,則取消所有加載任務(wù):mImageLoader.cancelAllTasks(); 2. 在ImageLoader中添加方法cancelAllTasks(): public void cancelAllTasks(){ if (mTask != null){ for (NewsAsyncTask task:mTask) { task.cancel(false);//任務(wù)取消 } } } 3. 修改 NewsAdapter 的有參構(gòu)造方法,添加參數(shù) ListView listView,并傳遞該參數(shù): mImageLoader = new ImageLoader(listView); 另外,別忘了注冊監(jiān)聽事件:listView.setOnScrollListener(this); 4. 修改 MainActivity 中的 onPostExecute: NewsAdapter adapter = new NewsAdapter(MainActivity.this,newsBeen,mListView); 5. 修改 ImageLoader 的 onPostExecute,在最后添加:mTask.remove(this); //設(shè)置完bitmap,任務(wù)結(jié)束,所以要移除該任務(wù)(寫在if之外) --------------------------- 核心:將顯示圖片的控制權(quán)由原來的 getView() 移交給 滑動監(jiān)聽事件。
    查看全部
  • 對 NewsAdapter 的修改: 1. 添加成員變量,同時(shí)也是一個(gè)靜態(tài)的數(shù)組: public static String[] URLS; //保存所有當(dāng)前所獲得的圖片的url地址 2. 修改之前寫的有參構(gòu)造方法,用for循環(huán)為靜態(tài)數(shù)組賦值: public NewsAdapter(Context context,List<NewsBean> datas){ mList=datas; mInflater=LayoutInflater.from(context); mImageLoader = new ImageLoader(mStart,mEnd); URLS = new String[datas.size()]; for (int i=0;i<datas.size();i++){ URLS[i] = datas.get(i).getNewsIconUrl(); } }
    查看全部
  • 本節(jié)步驟 1. 在ImageLoader中添加成員變量: private ListView mListView; //保存從start到end的圖片 private Set<NewsAsyncTask> mTask; //用于任務(wù)管理 2.修改原有的無參構(gòu)造方法,改為有參,參數(shù)是ListView listView。并做初始化: mListView = listView; mTask = new HashSet<>(); 3.構(gòu)建新的方法,加載從start到end的所有圖片 public void loadImages(int start,int end){ for (int i=start;i<end;i++){ String url = NewsAdapter.URLS[i]; Bitmap bitmap = getBitmapFromCache(url); if (bitmap==null) { NewsAsyncTask task = new NewsAsyncTask(url); task.execute(url); mTask.add(task); //加入任務(wù)管理表 }else { ImageView imageView = (ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); } } } 4.修改onPostExecute,原有內(nèi)容注釋掉,改為: ImageView imageView = (ImageView) mListView.findViewWithTag(mUrl); if (imageView != null && bitmap !=null){ imageView.setImageBitmap(bitmap); } 5. 修改showImageByAsyncTask(),參見另外一篇筆記。 6. 修改 NewsAdapter。 額外補(bǔ)充:ListView的findViewWithTag,通過Tag找到ImageView。那么Tag又是什么呢,就是url。
    查看全部
  • 這里對 showImageByAsyncTask做了修改: 將 new NewsAsyncTask(url).execute(url); 改成 imageView.setImageResource(R.mipmap.ic_launcher); 使用默認(rèn)圖片,將顯示的控制權(quán)移交給有參的構(gòu)造方法ImageLoader(int start,int end)。 我們不再使用getView()去觸發(fā)下載,而是使用ListView滾動的時(shí)候去觸發(fā)下載任務(wù)。
    查看全部
  • 實(shí)際項(xiàng)目中的 Item 可能非常復(fù)雜,僅僅使用前面所學(xué)的異步加載過程,效果可能并不好。這是因?yàn)?ListView的滾動對畫面流暢度的要求是非常高的,當(dāng)你做異步加載的時(shí)候,雖然加載是在新的線程中實(shí)行的,并沒有阻塞 UI 線程,但當(dāng)我們加載好之后,去更新 UI 線程,就會導(dǎo)致 UI線程發(fā)生一次“重繪”,而如果這次“重繪”正好發(fā)生在 ListView滾動的時(shí)候,就會導(dǎo)致滾動的“卡頓”,這種體驗(yàn)并不好。 那么,如何提高 ListView在滾動時(shí)候的異步加載的效率問題? 1. ListView滑動停止后才加載可見項(xiàng); 2. ListView滑動時(shí),取消所有加載項(xiàng)。 實(shí)際上,滾動的時(shí)候加載可見項(xiàng)是沒有意義的。 ------------------ NewsAdapter 實(shí)現(xiàn)接口 AbsListView.OnScrollListener,重寫如下兩個(gè)方法: onScrollStateChanged:當(dāng) ListView的滑動狀態(tài)改變的時(shí)候會調(diào)用此方法。 onScroll:在整個(gè)滑動狀態(tài)中都會去調(diào)用。 實(shí)現(xiàn)步驟: 判斷ListView當(dāng)前的滾動狀態(tài),如果它處于滾動過程中,則取消所有的正在加載的任務(wù),讓ListView安靜地滾動,當(dāng)它滾動完畢之后,我們再根據(jù)當(dāng)前 ListView 所反映的第一項(xiàng)和最后一項(xiàng),去加載這之間所有的項(xiàng)目,也就是在ListView停止?jié)L動之后加載所有可見項(xiàng)。
    查看全部
  • addBitmapToCache()和 getBitmapFromCache() 方法。
    查看全部
    0 采集 收起 來源:LruCache緩存(下)

    2017-03-21

  • LruCache類似Map,底層也是通過 HashMap實(shí)現(xiàn)的,所以也有 put與get 方法。 創(chuàng)建完兩個(gè)方法(addBitmapToCache 和 getBitmapFromCache )后,需要對之前的方法做一些修改: 1. 在showImageByAsyncTask()先判斷緩存中是否存在該對象,有則直接從緩存中取出,沒有才創(chuàng)建: Bitmap bitmap = getBitmapFromCache(url); if (bitmap==null) { new NewsAsyncTask(imageView, url).execute(url);//啟動異步加載 }else { imageView.setImageBitmap(bitmap);//直接使用緩存中的bitmap,無需異步加載 } 2. 在doInBackground()中,原先只是下載圖片,現(xiàn)在要把下載的圖片緩存到 LruCache 里面: Bitmap bitmap = getBitmapFromURL(params[0]); if(bitmap!=null){ //bitmap非空表示確實(shí)下載好了,這時(shí)將其緩存起來 addBitmapToCache(params[0],bitmap); } return bitmap; 3. 在 NewsAdapter 添加成員變量 ImageLoader mImageLoader; 并在構(gòu)造方法中初始化:mImageLoader = new ImageLoader(); 然后把getView()里面實(shí)現(xiàn)異步加載的這句代碼: new ImageLoader().showImageByAsyncTask(viewHolder.iv_icon,url); 改成 mImageLoader.showImageByAsyncTask(viewHolder.iv_icon,url); 這樣就保證只有一個(gè) LruCache。 ------------------ 使用緩存,是典型的以空間換時(shí)間,以內(nèi)存換效率。
    查看全部
    0 采集 收起 來源:LruCache緩存(下)

    2017-03-21

  • 使用 LruCache: 1. 在我們定義的類 ImageLoader里面添加成員變量: private LruCache<String,Bitmap> mCaches; 這里第一個(gè)參數(shù)(Key)就是緩存的圖片的名字,選擇URL地址作為名字較好,所以類型寫String,而第二個(gè)參數(shù)(Value)是我們要保存的對象,類型填Bitmap。 2. 在構(gòu)造方法中初始化 LruCache。在使用LruCache之前,我們需要設(shè)定一個(gè)可用范圍,畢竟不可能將所有內(nèi)存都作為緩存,這里要將一部分內(nèi)存轉(zhuǎn)化為我們所需要的緩存空間: 首先獲取當(dāng)前應(yīng)用可用的內(nèi)存大小: int maxMemory = (int)Runtime.getRuntime().maxMemory(); 然后設(shè)定一個(gè)我們所需要的緩存的大?。?int cacheSize = maxMemory / 4; 接著初始化 LruCache,通過匿名內(nèi)部類的方式重寫里面的sizeOf()方法,該方法是為了獲取每一個(gè)緩存對象的大小,我們必須重寫這個(gè)方法,去加載正確的內(nèi)存大小,不然它默認(rèn)返回元素的個(gè)數(shù),這樣就不對了。sizeOf()在每次存入緩存的時(shí)候會調(diào)用,我們就需要在加入緩存的時(shí)候,給出一個(gè)準(zhǔn)確的大小,也就是Bitmap的大小,這里直接 return value.getByteCount();將bitmap的實(shí)際大小保存進(jìn)去: mCache = new LruCache<String, Bitmap>(cacheSize){ @Override protected int sizeOf(String key, Bitmap value) { //在每次存入緩存的時(shí)候調(diào)用 return value.getByteCount(); } }; 這樣,LruCache就初始化好了。 我們要如何使用呢?在使用之前需要創(chuàng)建兩個(gè)方法,分別是“將內(nèi)容保存到LruCache”和“從LruCache中獲取內(nèi)容”,也就是set/get方法。
    查看全部
    0 采集 收起 來源:LruCache緩存(上)

    2018-03-22

  • 上節(jié)課我們滑動ListView,發(fā)覺曾經(jīng)加載的圖片還是要重新加載,僅僅只是滑動就要不停地反復(fù)加載,這樣就浪費(fèi)了流量,用戶也會抱怨。 解決方法:使用緩存,將已經(jīng)加載的圖片緩存起來,而不用每次都去加載。 使用緩存的好處:1.讓ListView的滑動更加流暢;2.節(jié)省流量,提高用戶體驗(yàn)。 LruCache:將內(nèi)容保存在內(nèi)存中,并以一定的方法管理這些內(nèi)容,做到在一定范圍之內(nèi)保證能夠緩存所有的內(nèi)容數(shù)據(jù),而在超出一定范圍之后,將近期最少使用的內(nèi)容剔除出去,從而實(shí)現(xiàn)一個(gè)非常優(yōu)秀的緩存管理。
    查看全部
    0 采集 收起 來源:LruCache緩存(上)

    2017-03-21

  • 異步加載圖片——AsyncTask的編寫 圖中的方式仍然存在緩存帶來的顯示錯誤的問題,和前面的多線程在未優(yōu)化之前出現(xiàn)的問題一樣,畢竟 AsyncTask 本身就基于多線程。解決方式和多線程類似,先在 NewsAsyncTask 類中添加成員變量 mUrl,在有參構(gòu)造方法中傳入url并賦值給 mUrl。然后在onPostExecute()方法中修改為: if (mImageView.getTag().equals(mUrl)) { mImageView.setImageBitmap(bitmap);//將Bitmap設(shè)置給ImageView } 只有當(dāng)Tag等于圖片自身的url的時(shí)候才加載圖片,否則保持原樣。避免了緩存圖片對正確圖片的影響。
    查看全部
    0 采集 收起 來源:使用AsyncTask

    2017-03-21

  • 在異步加載中,我們通常使用兩種方式去避免ListView的緩存所造成的ListView的Item的錯亂: 1. 在BaseAdapter中設(shè)置對應(yīng)的Tag,將一個(gè) url 或者其他可以表明身份的信息與相應(yīng)的Item綁定,并在真正加載的時(shí)候,去判斷這樣一個(gè)身份信息是否正確,只有正確的情況下才會去設(shè)置圖片(圖中橙色部分)。 2. 使用成員變量(圖中藍(lán)色部分),將對應(yīng)的數(shù)據(jù)進(jìn)行緩存,從而避免由于網(wǎng)絡(luò)下載時(shí)間不確定所導(dǎo)致的時(shí)序上的混亂,這種方式與我們在 BaseAdapter去使用ViewHolder這樣的一個(gè)模式去緩存View的方式是一樣的。我們通過成員變量將每次調(diào)用方法所傳進(jìn)來的參數(shù)緩存起來,從而避免時(shí)序上的順序錯誤。 這兩種方式在異步加載中是使用得非常廣泛的,大部分的異步加載錯誤都可以通過這兩種方式去解決。
    查看全部
    0 采集 收起 來源:使用Thread

    2017-03-21

舉報(bào)

0/150
提交
取消
課程須知
1、了解異步處理的一般方法 2、掌握如何使用多線程進(jìn)行異步加載 3、掌握如何使用ASyncTask進(jìn)行異步加載 4、異步加載的緩存與優(yōu)化
老師告訴你能學(xué)到什么?
本課程是Android中級課程 1、熟練掌握基本的Android應(yīng)用程序開發(fā)方法

微信掃碼,參與3人拼團(tuán)

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復(fù)購買,感謝您對慕課網(wǎng)的支持!