-
参数1: Params 用于传递参数数组params[],可以传递多个参数,在方法的内部获取参数时,通过 int a=params[0];的方式来获取传入的参数数据,参数数组下标从0开始,依次存储了录入的参数 参数2: Progress 记录AsyncTask<>的进度 参数3: Result 作为AsyncTask<>的返回值,可根据需要定制查看全部
-
Bean 组件查看全部
-
maxLine 设定文字行数查看全部
-
值得先学习查看全部
-
加载图片。。异步两种方式查看全部
-
http://www.imooc.com/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.imooc.com/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
提交
取消