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

為了賬號安全,請及時綁定郵箱和手機立即綁定

Android必學-異步加載

難度中級
時長 1小時57分
學習人數(shù)
綜合評分9.70
220人評價 查看評價
9.9 內(nèi)容實用
9.7 簡潔易懂
9.5 邏輯清晰
  • Android異步加載 異步加載:用異步的方式加載數(shù)據(jù),原因無非兩個:1.提高用戶體驗,用戶在加載數(shù)據(jù)的時候不會感覺到明顯的卡頓;2.安卓的要求。 異步加載最常用的兩種方式:多線程\線程池;AsyncTask。 其中AsyncTask的底層也是通過線程池實現(xiàn),所以二者異曲同工。
    查看全部
  • Android 異步加載的總結(jié) 1. 通過異步加載,避免阻塞UI線程,從而實現(xiàn)了網(wǎng)絡的異步訪問。這是基礎,也是 Android 要求我們這么做的。 2. 通過 LruCache,將已經(jīng)下載的圖片放到內(nèi)存中,以一個緩存避免多次重復的下載,提高用戶的體驗。當然,這里只介紹了內(nèi)存緩存,我們還可以使用 DiskLruCache ,將內(nèi)存中的圖片保存到硬盤中,保存到存儲器中,做為一個持久化的緩存,這也稱作“二級緩存”。而內(nèi)存緩存便叫做“一級緩存”。 3. 通過判斷 ListView 的滑動狀態(tài),決定什么時候該加載圖片,什么時候不該加載圖片,而讓ListView平滑地去滾動。在這一點上我們是通過對 ListView 的滑動狀態(tài)的監(jiān)聽,去實現(xiàn)這樣的操作,將加載圖片的控制權(quán)由 getView() 轉(zhuǎn)移到我們的滑動事件,從而讓復雜的 ListView 也能實現(xiàn)流暢的異步加載。 4. 不僅僅是 ListView ,任何控件都可以使用異步加載,這里以 ListView 作為例子的原因是因為它比較常用。異步加載不僅僅用于獲取網(wǎng)絡圖片,所有的耗時操作我們都可以認為是異步加載,通過異步的方式,去將這些耗時操作與主線程分開,從而提升用戶體驗,這也是異步加載的核心所在。
    查看全部
    0 采集 收起 來源:總結(jié)

    2017-06-03

  • 上節(jié)課中我們看到圖片最初并沒有加載,需要滑動才加載,因為我們把加載圖片的控制權(quán)交給了onScrollStateChanged ,也就是說只有滑動狀態(tài)改變,才觸發(fā)加載任務。那么預加載的問題該如何解決呢?我們可以把啟動時的圖片加載交給onScroll(因為它一直被調(diào)用)去執(zhí)行。步驟: 1. 在NewsAdapter中設置一個布爾變量,判斷當前是不是第一次啟動:private boolean mFirstIn; 在初始化的時候(就在構(gòu)造方法里面)把 mFirstIn設置為true。 2. 在 onScroll() 中進行判斷: if( mFirstIn && visibleItemCount>0){ mImageLoader.loadImages(mStart,mEnd); mFirstIn = false; } 為什么要寫visibleItemCount>0?因為 onScroll()會被多次調(diào)用,而初始化調(diào)用的時候visibleItemCount是等于0的,這時候 Item 還沒有被加載,所以我們要將這個過程跳過去。這就是為什么我們這里要使用兩個條件:當前列表是第一次顯示、而且 ListView 的 Item 已經(jīng)畫出來了。
    查看全部
  • 步驟: 1.在 NewsAdaper 中修改 onScrollStateChanged(): 如果停止?jié)L動則加載可見項:mImageLoader.loadImages(mStart,mEnd); 如果滾動,則取消所有加載任務:mImageLoader.cancelAllTasks(); 2. 在ImageLoader中添加方法cancelAllTasks(): public void cancelAllTasks(){ if (mTask != null){ for (NewsAsyncTask task:mTask) { task.cancel(false);//任務取消 } } } 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); //設置完bitmap,任務結(jié)束,所以要移除該任務(寫在if之外) --------------------------- 核心:將顯示圖片的控制權(quán)由原來的 getView() 移交給 滑動監(jiān)聽事件。
    查看全部
  • 4.修改onPostExecute,原有內(nèi)容注釋掉,改為: ImageView imageView = (ImageView) mListView.findViewWithTag(mUrl); if (imageView != null && bitmap !=null){ imageView.setImageBitmap(bitmap); } 在ImageView imageView=(ImageView) mListView.findViewWithTag(url); 我們不再使用getView()去觸發(fā)下載,而是使用ListView滾動的時候去觸發(fā)下載任務。
    查看全部
  • 異步加載——圖片加載優(yōu)化 1. 創(chuàng)建一個靜態(tài)String[]將所有要顯示的圖片的地址保存起來 public static String[] URLStrings;//用來保存當前所有需要顯示的圖片的url地址 public NewsAdapter(Context context, List<NewsBean> mListData) { super(); this.mList = mListData; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoader(); URLStrings = new String[mListData.size()]; for (int i = 0; i<mListData.size(); i++){ URLStrings[i] = mListData.get(i).imageUrl; }} 2. 創(chuàng)建一個方法,加載從start到end的所有圖片 public void loadImages(int start, int end){ for (int i = start; i < end; i++){ //因為URLStrings是靜態(tài)的,所以可以直接使用 String url = NewsAdapter.URLStrings[i]; //從緩存中獲取對應的圖片并判斷 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null){ NewsAsyncTask task = new NewsAsyncTask(url); task.execute(url); mTasks.add(task); }else { //從緩存中直接獲取數(shù)據(jù)讓iamgeView顯示,這里imageView是從url的tag得來的 ImageView imageView = (ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); }}} 3. 改寫showImageByAsyncTask(),讓顯示圖片的操作交給scroll的監(jiān)聽事件,當bitmap不在緩存時,也不去加載圖片
    查看全部
  • 實際項目中的 Item 可能非常復雜,僅僅使用前面所學的異步加載過程,效果可能并不好。這是因為 ListView的滾動對畫面流暢度的要求是非常高的,當你做異步加載的時候,雖然加載是在新的線程中實行的,并沒有阻塞 UI 線程,但當我們加載好之后,去更新 UI 線程,就會導致 UI線程發(fā)生一次“重繪”,而如果這次“重繪”正好發(fā)生在 ListView滾動的時候,就會導致滾動的“卡頓”,這種體驗并不好。 那么,如何提高 ListView在滾動時候的異步加載的效率問題? 1. ListView滑動停止后才加載可見項; 2. ListView滑動時,取消所有加載項。 實際上,滾動的時候加載可見項是沒有意義的。 ------------------ NewsAdapter 實現(xiàn)接口 AbsListView.OnScrollListener,重寫如下兩個方法: onScrollStateChanged:當 ListView的滑動狀態(tài)改變的時候會調(diào)用此方法。 onScroll:在整個滑動狀態(tài)中都會去調(diào)用。 實現(xiàn)步驟: 判斷ListView當前的滾動狀態(tài),如果它處于滾動過程中,則取消所有的正在加載的任務,讓ListView安靜地滾動,當它滾動完畢之后,我們再根據(jù)當前 ListView 所反映的第一項和最后一項,去加載這之間所有的項目,也就是在ListView停止?jié)L動之后加載所有可見項。
    查看全部
  • LruCache類似Map,底層也是通過 HashMap實現(xiàn)的,所以也有 put與get 方法。 創(chuàng)建完兩個方法(//將數(shù)據(jù)存入緩存中,增加到緩存public void addBitmapToCache(String url,Bitmap bitmap){//判斷緩存是否存在 if (getBitmapFromCache(url)==null) {mCaches.put(url, bitmap);}} //從緩存中獲取數(shù)據(jù)public Bitmap getBitmapFromCache(String url){return mCaches.get(url);} )后,需要對之前的方法做一些修改: 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非空表示確實下載好了,這時將其緩存起來 addBitmapToCache(params[0],bitmap); } return bitmap; 3. 在 NewsAdapter 添加成員變量 ImageLoader mImageLoader; 并在構(gòu)造方法中初始化:mImageLoader = new ImageLoader(); 然后把getView()里面實現(xiàn)異步加載的這句代碼: new ImageLoader().showImageByAsyncTask(viewHolder.iv_icon,url); 改成 mImageLoader.show。。 這樣就保證只有一個 LruCache。
    查看全部
    0 采集 收起 來源:LruCache緩存(下)

    2017-06-03

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

    2018-03-22

  • 使用asynctask實現(xiàn)異步加載圖片
    查看全部
    0 采集 收起 來源:使用AsyncTask

    2017-06-03

  • 在異步加載中,我們通常使用兩種方式去避免ListView的緩存所造成的ListView的Item的錯亂: 1. 在BaseAdapter中設置對應的Tag,將一個 url 或者其他可以表明身份的信息與相應的Item綁定,并在真正加載的時候,去判斷這樣一個身份信息是否正確,只有正確的情況下才會去設置圖片(if (mImageView.getTag().equals(mUrl)) )。 2. 使用成員變量(mImageView=iamgeView;mUrl=url;),將對應的數(shù)據(jù)進行緩存,從而避免由于網(wǎng)絡下載時間不確定所導致的時序上的混亂,這種方式與我們在 BaseAdapter去使用ViewHolder這樣的一個模式去緩存View的方式是一樣的。我們通過成員變量將每次調(diào)用方法所傳進來的參數(shù)緩存起來,從而避免時序上的順序錯誤。 這兩種方式在異步加載中是使用得非常廣泛的,大部分的異步加載錯誤都可以通過這兩種方式去解決。 在子線程中將Bitmap以message的形式發(fā)送出去: Bitmap bitmap = getBitmapFromURL(url);//從 url中獲取 bitmap。 Message message = Message.obtain();//此方法使用現(xiàn)有的、已回收的Message,提高Message的使用效率。 message.obj = bitmap;//將信息的內(nèi)容(obj)設置為 bitmap。 handler.sendMessage(message);//調(diào)用Handler將載有bitmap的Message發(fā)送出去。 注意這里的 Handler 要選擇android.os.Handler的。
    查看全部
    0 采集 收起 來源:使用Thread

    2017-06-01

  • 我們發(fā)現(xiàn)異步加載出現(xiàn)圖片錯位的情況,圖片的排列順序有問題。 圖片顯示錯位的原因:ListView自身的緩存機制。正確的ListView沒有顯示正確的URL。 解決辦法:在適配器中給每一個圖片設置一個標識Tag,Tag本身就是圖片對應的url,也就是將圖片和 url 進行了綁定。 如圖,只有當Tag等于圖片自身的url的時候才加載圖片,否則保持原樣。避免了緩存圖片對正確圖片的影響。
    查看全部
    0 采集 收起 來源:使用Thread

    2017-06-01

  • 將圖片的地址 urlString 轉(zhuǎn)變?yōu)?Bitmap。 基本上和網(wǎng)絡相關的操作都需要捕捉異常。 1. 將 urlString(字符串類型)轉(zhuǎn)變?yōu)?URL 類型對象url。 2. 通過 url 獲取連接對象 connection。方法:url.openConnection()。 3. 通過連接對象獲得輸入流,并用BufferedInputStream包裝: is = new BufferedInputStream(connection.getInputStream()); 4. 將輸入流解析為Bitmap:bitmap = BitmapFactory.decodeStream(is); 5. 釋放資源:connection.disconnect(); is.close();
    查看全部
  • 異步加載——實現(xiàn)ListView圖文混排邏輯總結(jié) 第一步 onCreate中new一個NewsAsyncTask 將url傳遞給getJsonData 實現(xiàn)異步訪問 第二步 getJsonData將url轉(zhuǎn)換為NewsBean對象 第三步 onPostExecute講NewsBean的數(shù)據(jù)傳遞給NewsAdapter 第四步 NewsAdapter構(gòu)造一個ListView數(shù)據(jù)源 并將數(shù)據(jù)源設置給ListView 異步加載的第一層:通過AsyncTask訪問網(wǎng)絡,獲取json或者XML字符串,然后解析他們產(chǎn)生若干object,將每個object放入到ListVIew中(adapter需要使用view holder pattern去寫),AsyncTask中的訪問網(wǎng)絡獲取json或者XML字符串,并且產(chǎn)生若干個object的工作就是在doInBackground()方法中進行的,所以這個方法總的來說就是用來準備數(shù)據(jù)源的。
    查看全部
    0 采集 收起 來源:邏輯梳理

    2017-06-01

  • 本節(jié)課目標:文藝方式重現(xiàn)BaseAdpter 1、自定義Adpter繼承BaseAdpter; 2、定義變量:List<NewsBean>;LayoutInflater; 3、重寫構(gòu)造函數(shù)NewsAdpter(Context context, List<NewsBean> data)。 4、文藝方式重寫getView()方法。 4.1、自定義類ViewHolder,映射相關的view對象 最后在 onPostExecute()方法中將生成的 newsBean添加到 mListView:通過適配器加載: NewsAdapter adapter = new NewsAdapter(MainActivity.this,newsBeen); mListView.setAdapter(adapter);
    查看全部

舉報

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

微信掃碼,參與3人拼團

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

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