-
參數(shù)1: Params 用于傳遞參數(shù)數(shù)組params[],可以傳遞多個(gè)參數(shù),在方法的內(nèi)部獲取參數(shù)時(shí),通過(guò) int a=params[0];的方式來(lái)獲取傳入的參數(shù)數(shù)據(jù),參數(shù)數(shù)組下標(biāo)從0開始,依次存儲(chǔ)了錄入的參數(shù) 參數(shù)2: Progress 記錄AsyncTask<>的進(jìn)度 參數(shù)3: Result 作為AsyncTask<>的返回值,可根據(jù)需要定制查看全部
-
Bean 組件查看全部
-
maxLine 設(shè)定文字行數(shù)查看全部
-
值得先學(xué)習(xí)查看全部
-
加載圖片。。異步兩種方式查看全部
-
http://idcbgp.cn/api/teacher?type=4&num=30查看全部
-
異步加載——圖片加載優(yōu)化 (接上一筆記) 4. 讓NewsAdapter實(shí)現(xiàn)OnScrollListener,重寫其監(jiān)聽事件方法 public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub if(scrollState == SCROLL_STATE_IDLE){ mImageLoader.loadImages(mStart, mEnd); //滑動(dòng)停止,加載從start到end的圖片 }else{ mImageLoader.cancelAllTasks(); //正在滑動(dòng),取消所有的加載任務(wù) } } 5. mImageLoader這個(gè)對(duì)象的獲取也需要改 public NewsAdapter(Context context, List<NewsBean> mListData, ListView listView) { …… mImageLoader = new ImageLoader(listView); …… listView.setOnScrollListener(this);//為listView設(shè)置監(jiān)聽事件 } 6. 首次啟動(dòng)預(yù)加載 onScrollStateChanged()這個(gè)方法在初始狀態(tài)是不會(huì)被調(diào)用的,在onScroll()方法中做一個(gè)處理。 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { …… //第一次顯示時(shí)將被調(diào)用 if(mFirstIn && visibleItemCount > 0){ mImageLoader.loadImages(mStart, mEnd); mFirstIn = false; } } 小結(jié)(如圖) 使用loadImages()目的是將加載圖片的操作權(quán)交給監(jiān)聽事件。查看全部
-
異步加載——圖片加載優(yōu)化 1. 創(chuàng)建一個(gè)靜態(tài)String[]將所有要顯示的圖片的地址保存起來(lái) public static String[] URLStrings;//用來(lái)保存當(dāng)前所有需要顯示的圖片的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)建一個(gè)方法,加載從start到end的所有圖片 public void loadImages(int start, int end){ for (int i = start; i < end; i++){ //因?yàn)閁RLStrings是靜態(tài)的,所以可以直接使用 String url = NewsAdapter.URLStrings[i]; //從緩存中獲取對(duì)應(yīng)的圖片并判斷 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得來(lái)的 ImageView imageView = (ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); }}} 3. 改寫showImageByAsyncTask(),讓顯示圖片的操作交給scroll的監(jiān)聽事件 (如圖) 當(dāng)bitmap不在緩存時(shí),也不去加載圖片查看全部
-
異步加載——LruCache緩存 (接上一筆記) (3)改寫showImageByAsyncTask()和doInBackground() bitmap不在緩存中時(shí)才下載;下載完之后保存在cache中。 public void showImageByAsyncTask(ImageView imageView, String url){ //從緩存中獲取對(duì)應(yīng)的圖片并判斷 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null){ new NewsAsyncTask(imageView, url).execute(url); }else { //從緩存中直接獲取數(shù)據(jù)讓iamgeView顯示 imageView.setImageBitmap(bitmap); } } protected Bitmap doInBackground(String... params) { String url = params[0]; Bitmap bitmap = getBitmapFromURL(url); if(bitmap!=null){ addBitmapToCache(url, bitmap); } return bitmap; } (4)最后要在創(chuàng)建Adapter對(duì)象時(shí)給ImageLoader的對(duì)象初始化,直接使用該對(duì)象。這樣不會(huì)每次都創(chuàng)建LruCache。 public NewsAdapter(Context context, List<NewsBean> mListData) { super(); this.mList = mListData; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoader(); } //通過(guò)AsyncTask執(zhí)行顯示ImageView額操作 mImageLoader.showImageByAsyncTask(viewHolder.imageView, urlString);查看全部
-
受益匪淺。。棒棒噠查看全部
-
異步加載——LruCache緩存 1. Lrc——Least Recently Used,LruCache類來(lái)實(shí)現(xiàn)緩存算法。 LruCache類將內(nèi)容保存在內(nèi)存中,并以一定的方法管理這些內(nèi)容,來(lái)實(shí)現(xiàn)緩存管理。 2. LrcCache本質(zhì)是一個(gè)Map,底層是通過(guò)HashMap實(shí)現(xiàn)的。 所以在使用LruCache時(shí)可以通過(guò)調(diào)用set()和get()方法使用。 3. 使用步驟: (1)先創(chuàng)建一個(gè)LruCache,并在構(gòu)造函數(shù)中初始化它。 注意:通過(guò)匿名內(nèi)部類的方式實(shí)現(xiàn)sizeOf()方法,sizeOf()方法用來(lái)獲取每次緩存的對(duì)象的大小,默認(rèn)返回元素的個(gè)數(shù)。sizeOf()方法在每次元素加入緩存時(shí)調(diào)用。 private LruCache<String, Bitmap> mLruCache; public ImageLoader() { //通過(guò)Runtime類獲取運(yùn)行時(shí)最大內(nèi)存 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory/4; mLruCache = new LruCache<String, Bitmap>(cacheSize){ protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); }};} (2)兩個(gè)set()和get()方法,分別是加入元素到緩存以及從緩存中獲取數(shù)據(jù) public void addBitmapToCache(String url, Bitmap bitmap){ if(getBitmapFromCache(url)==null){ mLruCache.put(url, bitmap); } } public Bitmap getBitmapFromCache(String url){ return mLruCache.get(url); } (3)改寫showImageByAsyncTask()和doInBackground() (如圖)bitmap不在緩存中時(shí)才下載;下載完之后保存在cache中。 (4)最后要在創(chuàng)建Adapter對(duì)象時(shí)給ImageLoader的對(duì)象初始化,直接使用該對(duì)象。這樣不會(huì)每次都創(chuàng)建LruCache。查看全部
-
根據(jù)URL直接獲取連網(wǎng)獲取數(shù)據(jù),簡(jiǎn)單粗暴查看全部
-
異步加載——小結(jié) 在異步加載中,當(dāng)網(wǎng)絡(luò)環(huán)境不是很好情況下,ListView本身的緩沖機(jī)制可能會(huì)造成ListView的item顯示錯(cuò)亂。 兩種方法可以避免這種問題: 1. 將當(dāng)前的item與原始數(shù)據(jù)綁定 例如上一筆記中,在Adapter的getView()方法中為每個(gè)ImageView設(shè)置一個(gè)url的tag String urlString = newsBean.imageUrl; viewHolder.imageView.setTag(urlString); 在主線程的Handler中真正加載進(jìn)行更新UI時(shí),會(huì)判斷這個(gè)tag是否是對(duì)應(yīng)的。只有當(dāng)tag是正確時(shí)才會(huì)真正做設(shè)置item的操作 if(mImageView.getTag().equals(urlString)) mImageView.setImageBitmap((Bitmap) msg.obj); 2. 使用成員變量將對(duì)應(yīng)的數(shù)據(jù)進(jìn)行緩存,這種方式就相當(dāng)于BaseAdapter中使用ViewHolder是一樣的。查看全部
-
url = http://idcbgp.cn/api/teacher?type=4&num=30查看全部
-
異步加載——Thread方式 1. 將url轉(zhuǎn)換成Bitmap 通過(guò)InputStream,調(diào)用BitmapFactory.decodeStream()方法將url String轉(zhuǎn)換成一個(gè)bitmap并返回。 public Bitmap getBitmapFromURL(String urlString) { Bitmap bitmap; InputStream is = null; try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); is = new BufferedInputStream(connection.getInputStream()); //從urlString中獲取InputStream bitmap = BitmapFactory.decodeStream(is); //通過(guò)decodeStream獲取bitmap return bitmap; } 2. 從getBitmapFromURL()獲得的bitmap對(duì)象是不能直接設(shè)置給ImageView的 按照android單線程模型,非主線程是不能在此線程中直接更新UI的,可以通過(guò)一個(gè)Handler來(lái)傳遞帶有bitmap的消息給主線程,讓主線程的handler更新UI。 如圖: (1)開辟一個(gè)線程,在線程中將url轉(zhuǎn)換成bitmap (2)通過(guò)sendMessage()以消息的形式將bitmap發(fā)送給主線程的Handler (3)在Handler中設(shè)置bitmap給ImageView 3. 為了保證ListView每行數(shù)據(jù)中的ImageView能夠正確顯示,在Adapter的getView()方法中為每個(gè)ImageView設(shè)置一個(gè)tag String urlString = newsBean.imageUrl; viewHolder.imageView.setTag(urlString); 主線程的Handler中更新UI時(shí),會(huì)判斷這個(gè)tag,是否是對(duì)應(yīng)的。 if(mImageView.getTag().equals(urlString)) mImageView.setImageBitmap((Bitmap) msg.obj);查看全部
舉報(bào)
0/150
提交
取消