SoftReference 内存缓存 和 listview 分页加载

来源:互联网 发布:郭天祥51单片机pdf 编辑:程序博客网 时间:2024/06/13 19:15
package com.itcast.douban;import java.lang.ref.SoftReference;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.graphics.Bitmap;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.RatingBar;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.google.gdata.data.Link;import com.google.gdata.data.douban.Attribute;import com.google.gdata.data.douban.CollectionEntry;import com.google.gdata.data.douban.CollectionFeed;import com.google.gdata.data.douban.Subject;import com.google.gdata.data.douban.UserEntry;import com.google.gdata.data.extensions.Rating;import com.itcast.douban.domain.Book;import com.itcast.douban.util.LoadImageAsynTask;import com.itcast.douban.util.LoadImageAsynTask.LoadImageAsynTaskCallBack;public class MyReadActivity extends BaseActvity implements OnItemClickListener, OnScrollListener {protected static final String TAG = "MyReadActivity";private ListView subjectlist;private MyReadAdapter adapter;/** * key是图片的url,value是 软因用类型的bitmap */Map<String,SoftReference<Bitmap>> iconCache;int startIndex;//开始获取内容的id  相等于页数 第一页 int pagesize;int max = 20;boolean isloading = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.subject);super.onCreate(savedInstanceState);//初始化内存缓存iconCache = new HashMap<String, SoftReference<Bitmap>>();startIndex = 1;pagesize = 4;}@Overridepublic void setupView() {mRelativeLayoutLoding = (RelativeLayout) this.findViewById(R.id.loading);subjectlist = (ListView) this.findViewById(R.id.subjectlist);}@Overridepublic void setListener() {subjectlist.setOnItemClickListener(this);subjectlist.setOnScrollListener(this);//滚动的监听器}@Overridepublic void fillData() {// 通过异步任务获取数据 显示到界面上new AsyncTask<Void, Void,List<Book>>() {@Overrideprotected void onPostExecute(List<Book> result) {hideLoading();super.onPostExecute(result);if(result != null){if(adapter == null){adapter = new MyReadAdapter(result);subjectlist.setAdapter(adapter);}else{//把新获取到的数据加入到listview的数据适配器里面  通知页面更新内容adapter.addMoreBook(result);adapter.notifyDataSetChanged();//通知数据适配器更新数据}}else{showToast("获取数据失败");}isloading = false;}@Overrideprotected void onPreExecute() {showLoading();isloading = true;super.onPreExecute();}@Overrideprotected List<Book> doInBackground(Void... params) {try {UserEntry ue = doubanservice.getAuthorizedUser();String uid = ue.getUid();// 首先获取用户的 所有收集的信息CollectionFeed feeds = doubanservice.getUserCollections(uid,"book", null, null,startIndex,pagesize);List<Book> books = new ArrayList<Book>();for (CollectionEntry ce : feeds.getEntries()) {Subject se = ce.getSubjectEntry();if (se != null) {Book book = new Book();String title = se.getTitle().getPlainText();book.setBookname(title);StringBuilder sb = new StringBuilder();for (Attribute attr : se.getAttributes()) {if ("author".equals(attr.getName())) {sb.append(attr.getContent());sb.append("/");} else if ("publisher".equals(attr.getName())) {sb.append(attr.getContent());sb.append("/");} else if ("pubdate".equals(attr.getName())) {sb.append(attr.getContent());sb.append("/");} else if ("isbn10".equals(attr.getName())) {sb.append(attr.getContent());sb.append("/");}}book.setDescription(sb.toString());Rating rating = se.getRating();if (rating != null) {book.setRating(rating.getAverage());}for (Link link : se.getLinks()) {if ("image".equals(link.getRel())) {book.setBookurl(link.getHref());}}books.add(book);}}return books;} catch (Exception e) {e.printStackTrace();return null;}}}.execute();}@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {// TODO Auto-generated method stub}private void LoadBitmap(final ImageView iv, Book book, final String iconname) {LoadImageAsynTask task = new LoadImageAsynTask(new LoadImageAsynTaskCallBack() {@Overridepublic void beforeLoadImage() {iv.setImageResource(R.drawable.book);}@Overridepublic void afterLoadImage(Bitmap bitmap) {if(null != bitmap){Log.i(TAG,"服务器下载图片");iv.setImageBitmap(bitmap);//把bitmap存放到sd卡上//1.存放的格式 2.做一定比例的压缩 100无损的存放 Environment.getExternalStorageDirectory()//加入 写入sdcard权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>   // <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>//File file = new File(Environment.getExternalStorageDirectory()+"/"+iconname);//FileOutputStream fos;//try {//fos = new FileOutputStream(file);//bitmap.compress(CompressFormat.JPEG,100,fos);//} catch (FileNotFoundException e) {//e.printStackTrace();//}//缓存到内存中iconCache.put(iconname,new SoftReference<Bitmap>(bitmap));}else{iv.setImageResource(R.drawable.book);}}});task.execute(book.getBookurl());}private class MyReadAdapter extends BaseAdapter{private List<Book> books;public MyReadAdapter(List<Book> books) {this.books = books;}public void addMoreBook(List<Book> books){for(Book book:books){this.books.add(book);}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn books.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn books.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = View.inflate(MyReadActivity.this,R.layout.book_item,null);final ImageView iv = (ImageView) view.findViewById(R.id.book_img);TextView tv_desc= (TextView) view.findViewById(R.id.book_description);TextView tv_title = (TextView) view.findViewById(R.id.book_title);RatingBar rb  = (RatingBar) view.findViewById(R.id.ratingbar);Book book = books.get(position);if(book.getRating() !=0){rb.setRating(book.getRating());}else{rb.setRating(View.INVISIBLE);}tv_desc.setText(book.getDescription());tv_title.setText(book.getBookname());//判断图片是否在sd卡上存在String iconpath = book.getBookurl();final String iconname = iconpath.substring(iconpath.lastIndexOf("/")+1,iconpath.length());//File file = new File(Environment.getExternalStorageDirectory()+"/"+iconname);//if(file.exists()){//Log.i(TAG,"使用sdk缓存图片");//iv.setImageURI(Uri.fromFile(file));if(iconCache.containsKey(iconname)){SoftReference<Bitmap> sofref = iconCache.get(iconname);if(sofref != null){Bitmap bitmap = sofref.get();if(null != bitmap){Log.i(TAG,"使用内存缓存");iv.setImageBitmap(bitmap);}else{LoadBitmap(iv, book, iconname);}}}else{LoadBitmap(iv, book, iconname);}return view;}}/** * 当listview 发生滚动的时候调用的方法 */@Overridepublic void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {Log.i(TAG,"onScroll");}/** * 滚动状态发生变化的时候调用 */@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {Log.i(TAG,"onScrollStateChanged");switch (scrollState) {case OnScrollListener.SCROLL_STATE_IDLE://如果滚动状态为静止状态 并且listview里面最后一个用户可见条目内容等于listview数据//适配器里面的最后一个条目int position = view.getLastVisiblePosition();//获取最后一个可见条目 对应的未知int count = adapter.getCount();Log.i(TAG,"listview可见的最后一个条目的位置"+position+"listview 条目的数目"+count);if(position ==(count -1)){//获取更多的数据  Log.i(TAG,"startIndex=="+startIndex+"...count==="+count);if(startIndex>count){Toast.makeText(this,"数据加载完毕",0).show();return ;}if(isloading){return ;}startIndex = startIndex+count;fillData();}break;default:break;}}}

0 0
原创粉丝点击