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