Android批量图片加载系列——afinal实现图片加载
Afinal 是一个 android 的 http 框架、 sqlite orm 和 ioc 框架。使其更加简单易用, Afinal 的宗旨是简洁,快速。约定配置的方式之后,尽量一行代码完成所有事情,代码入侵性小,在三者中比较推荐。在这里我们主要使用 http 框架的 FinalHttp 和 FinalBitmap 组件实现网络图片的加载
案例介绍 —— 实现图片新闻浏览:
二、案例主要组件 |
1 、 FinalHttp 使用方法 : FinalHttp fh=new FinalHttp();
( 1 )发送 Post 方式请求
fh.post(url, new AjaxCallBack<String> (){
@Override
public void onFailure(Throwable t, String strMsg) { // 请求失败调用
super.onFailure(t, strMsg);
}
@Override
public void onLoading( long count, long current) { // 请求过程中没一秒回调一次
super.onLoading(count, current);
}
@Override
public void onStart() { // 开始异步请求时调用
super.onStart();
}
@Override
public void onSuccess(String t) { // 请求成功调用,并接受返回结果
});
( 2 )发送 Get 方式请求
fh.get(url, callBack); 用法同 Post 方式
( 3 )下载文件
方法参数分别表示下载文件的 url 、文件保存目标、 AjaxCallBack 回调方法
fh.download(url, "/mnt/sdcard/21-sun.apk", new AjaxCallBack<File> (){
@Override
public void onLoading( long count, long current) {
// TODO Auto-generated method stub
tvProcess.setText(" 下载进度 "+(current/ count));
}
@Override
public void onSuccess(File f) { // 请求成功调用,并接受返回结果
tvFileName.setText(f== null ?"" :f.getAbsoluteFile().toString());
}
});
2 、向服务端传递参数
AjaxParams params= new AjaxParams(); // 设置请求参数
params.put("category", "today");
调用 fh.get(url,params,ajaxCallback) 或 fh.post(url,params,ajaxCallback) 方法传递数据
jsp 服务端
通过 request.getParameter(“category”); 获得文本参数
也可上传文件
params.put(“profile_picture”,new File(“/mnt/sdcard/head.jpg”)) 或
params.put(“profile_picture”,InputStream);
服务端
可使用 commfileupload 组件实现上传
3 、 FinalBitmap 实现缓存并异步加载网络图片
// 创建 FinalBitmap, 并设置文件缓存的位置、内存缓存的百分比 ( 如:系统内存的 1/8)
FinalBitmap fb=FinalBitmap.create( this, diskCachePath, memoryCacheSizePercent);
// 进行配置,可不设置
fb.configLoadingImage(R.drawable.default_big); // 设置图片正在加载的时候显示的图片
fb.configLoadfailImage(R.drawable.error_big); // 设置图片加载失败时候显示的图片
配置方法还有 :
configBitmapMaxHeight( int bitmapHeight) // 配置默认图片的最大的高度
configBitmapMaxWidth( int bitmapWidth) // 配置默认图片的最大的宽度
configDisplayer(Displayer displayer) // 设置显示器,比如在显示的过程中显示动画等
// 设置下载器,比如通过 ftp 或者其他协议去网络读取图片的时候可以设置这项
configDownlader(Downloader downlader)
最后调用 display() 完成图片的加载:
// 第一参数表示显示图片的 UI ,第二参数为图片网络地址
fb.display(view,url); // 加载图片,先从缓存中加载,内存没有再从网络加载
三、案例完整代码 |
1 、 SunNewsApplication 组件
public class SunNewsApplication extends Application {
private FinalBitmap fb;
@Override
public void onCreate(){
fb =FinalBitmap.create( this);
fb.configLoadingImage(R.drawable.default_big);// 设置图片正在加载的时候显示的图片
}
public FinalBitmap getFinalBitmap(){
return fb;
}
}
2 、编写适配器
public class MoreStyleNewsListViewAdapter extends BaseAdapter {
private Activity mActivity;
private List<NewsItem> newsList;
private FinalBitmap imageLoader;
public MoreStyleNewsListViewAdapter(Activity mActivity,List<NewsItem> newsList){
this .mActivity= mActivity;
this .newsList= newsList;
imageLoader = ((SunNewsApplication)mActivity.getApplication()).getFinalBitmap();
}
private final int TYPE_COUNT=2 ;
/**
* 返回数据项的显示类型数据
* 0 1 2
*/
@Override
public int getItemViewType( int position) {
// TODO Auto-generated method stub
return newsList!= null ?newsList.get(position).getStyle():-1 ;
}
/**
* 返回类型个数
*/
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return TYPE_COUNT;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
Log.d("jereh","getCount()" );
return newsList.size();
}
@Override
public Object getItem( int position) {
// TODO Auto-generated method stub
Log.d("jereh","getItem()" );
return newsList.get(position);
}
@Override
public long getItemId( int position) {
// TODO Auto-generated method stub
Log.d("jereh","getItemId()" );
return position;
}
@Override
public View getView( int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder= null;
NewsItem item = newsList.get(position);
if (convertView== null){
holder = new ViewHolder();
// 将 layout.xml 转换为 View
switch(item.getStyle()){
case 0 :
convertView =LayoutInflater.from(mActivity).inflate(R.layout.news_item1, null);
holder.ivImg1 = (ImageView)convertView.findViewById(R.id.ivNewsImg);
break;
case 1 :
convertView =LayoutInflater.from(mActivity).inflate(R.layout.news_item2, null);
holder.ivImg1 = (ImageView)convertView.findViewById(R.id.ivImg1);
holder.ivImg2 = (ImageView)convertView.findViewById(R.id.ivImg2);
holder.ivImg3 = (ImageView)convertView.findViewById(R.id.ivImg3);
break;
}
holder.tvTilte = (TextView)convertView.findViewById(R.id.tvTitle);
convertView.setTag(holder);// 记录个标识
} else{
holder = (ViewHolder)convertView.getTag();
}
// 向 ui 元素绑定数据
holder.tvTilte.setText(item.getTitle());
imageLoader.display(holder.ivImg1, item.getImgUrl()[ 0]); // 加载图片,先从缓存中加载,内存没有再从网络加载
switch(item.getStyle()){
case 1 :
imageLoader.display(holder.ivImg2, item.getImgUrl()[ 1]); // 加载图片,先从缓存中加载,内存没有再从网络加载
imageLoader.display(holder.ivImg3, item.getImgUrl()[2]); // 加载图片,先从缓存中加载,内存没有再从网络加载
break;
}
Log.d( "jereh","getView()" );
return convertView;
}
private class ViewHolder{
private TextView tvTilte;
private ImageView ivImg1;
private ImageView ivImg2;
private ImageView ivImg3;
}
}
3 、编写 MaintActivity
public class MainActivity extends Activity {
private RadioGroup rgChannel;
private List<NewsItem> newsList= new ArrayList<NewsItem> ();
private MoreStyleNewsListViewAdapter adapter;
private ListView newsListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initView();
requestData();
}
private void initView(){
rgChannel =(RadioGroup) super.findViewById(R.id.rgChannel);
rgChannel.check(R.id.rbToday);
newsListView =(ListView) super.findViewById(R.id.lvNews);
adapter = new MoreStyleNewsListViewAdapter( this,newsList);
newsListView.setAdapter(adapter);
}
/**
* 异步请求获得网络数据
*/
private void requestData(){
String url ="http://192.168.0.107:8080/21-sun/NewsListServlet" ;
FinalHttp fh = new FinalHttp();
AjaxParams params = new AjaxParams(); // 设置请求参数
params.put("category", "today" );
fh.post(url, params,new AjaxCallBack<String> (){
@Override
public void onFailure(Throwable t, String strMsg) { // 请求失败调用
// TODO Auto-generated method stub
Log.d("jereh" ,strMsg);
}
@Override
public void onSuccess(String t) { // 请求成功调用,并接受返回结果
// TODO Auto-generated method stub
Gson gson= new Gson();
List list =gson.fromJson(t, new TypeToken<ArrayList<NewsItem>> (){}.getType());
newsList.addAll(list);
adapter.notifyDataSetChanged();
}
});
}