小武:相信你们都用过网络请求解析数据,只是方法不同而已,可是,逻辑都是差很少的:mysql
一:AsyncTask解析数据android
AsyncTask主要用来更新UI线程,比较耗时的操做能够在AsyncTask中使用。sql
AsyncTask是个抽象类,使用时须要继承这个类,而后调用execute()方法。注意继承时须要设定三个泛型Params,Progress和Result的类型,如AsyncTask<Void,Inetger,Void>:数据库
- Params是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型
- Progress是指更新进度时传递的参数类型,即publishProgress()和onProgressUpdate()的参数类型
- Result是指doInBackground()的返回值类型
上面的说明涉及到几个方法:
- doInBackgound() 这个方法是继承AsyncTask必需要实现的,运行于后台,耗时的操做能够在这里作
- publishProgress() 更新进度,给onProgressUpdate()传递进度参数
- onProgressUpdate() 在publishProgress()调用完被调用,更新进度
1.下面咱们来看看主函数的布局:activity_main.xml,其中,这几个方法除了主函数不同以外,其余的代码都同样。apache
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <EditText
- android:id="@+id/et_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="15dp"
- android:layout_marginTop="28dp"
- android:ems="10" >
-
- <requestFocus />
- </EditText>
-
- <Button
- android:id="@+id/bt_search"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignBottom="@+id/et_name"
- android:layout_toRightOf="@+id/et_name"
- android:onClick="search"
- android:text="搜索" />
-
- <ListView
- android:id="@+id/listView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_below="@+id/et_name"
- android:layout_marginTop="26dp" >
- </ListView>
-
- </RelativeLayout>
2.适配器的布局:list_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <ImageView
- android:id="@+id/imageView"
- android:layout_width="60dp"
- android:layout_height="60dp"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:src="@drawable/ic_launcher" />
-
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_toRightOf="@+id/imageView"
- android:text="TextView" />
-
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignLeft="@+id/textView1"
- android:layout_below="@+id/textView1"
- android:text="TextView" />
-
- <TextView
- android:id="@+id/textView3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignLeft="@+id/textView2"
- android:layout_below="@+id/textView2"
- android:text="TextView" />
-
- </RelativeLayout>
3. 主函数 MainActivity.java
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
-
- import android.app.Activity;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
-
- import com.bwie.test.Data1.MyData;
- import com.google.gson.Gson;
- import com.lidroid.xutils.HttpUtils;
- import com.lidroid.xutils.exception.HttpException;
- import com.lidroid.xutils.http.ResponseInfo;
- import com.lidroid.xutils.http.callback.RequestCallBack;
- import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
-
- public class MainActivity extends Activity {
-
- private EditText et_search;
- private ListView listView;
- private String trim;
- protected static final int SUCEESS = 0;
- private MyBaseAdapter adapter;
- ArrayList<MyData> myList = new ArrayList<MyData>();
-
- private Button bt_search;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- et_search = (EditText) findViewById(R.id.et_name);
- bt_search = (Button) findViewById(R.id.bt_search);
- listView = (ListView) findViewById(R.id.listView);
-
-
- bt_search.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- trim = et_search.getText().toString().trim();
- String path = "http://93.gov.cn/93app/get_search.do?key="
- + trim;
- MyAsyncTask task = new MyAsyncTask();
- task.execute(path);
- }
- });
- }
-
- class MyAsyncTask extends AsyncTask<String, Void, String> {
-
- @Override
- protected String doInBackground(String... params) {
-
- try {
- URL url = new URL(params[0]);
- HttpURLConnection openConnection = (HttpURLConnection) url
- .openConnection();
- openConnection.setConnectTimeout(5000);
- openConnection.setReadTimeout(5000);
- int responseCode = openConnection.getResponseCode();
- if (responseCode == 200) {
- InputStream inputStream = openConnection.getInputStream();
- StreamUtils streamUtils = new StreamUtils();
- String parseStream = streamUtils.parseSteam(inputStream);
- System.out.println("-----------parseStream------------"
- + parseStream);
- return parseStream;
- }
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(String result) {
- super.onPostExecute(result);
- Gson gson = new Gson();
- Data1 fromJson = gson.fromJson(result,
- Data1.class);
- System.out.println("-----------fromJson------------" + fromJson);
- ArrayList<MyData> data = fromJson.getData();
- listView.setAdapter(new MyBaseAdapter(
- MainActivity.this, data));
- }
- }
-
- }
4.适配器 MyBaseAdapter.java
- import java.util.ArrayList;
-
- import com.bwie.test.Data1.MyData;
- import com.nostra13.universalimageloader.core.DisplayImageOptions;
- import com.nostra13.universalimageloader.core.ImageLoader;
-
- import android.content.Context;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
-
- public class MyBaseAdapter extends BaseAdapter {
- private Context context;
- private ArrayList<MyData> list;
- private DisplayImageOptions initOptions;
-
- public MyBaseAdapter(Context context, ArrayList<MyData> list) {
- this.context = context;
- this.list = list;
-
- initOptions = ImageLoaderUtils.initOptions();
- }
-
- @Override
- public int getCount() {
- return list.size();
- }
-
- @Override
- public Object getItem(int arg0) {
- return null;
- }
-
- @Override
- public long getItemId(int arg0) {
- return 0;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup viewGroup) {
- View view = View.inflate(context, R.layout.list_item, null);
- ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
- TextView textView1 = (TextView) view.findViewById(R.id.textView1);
- TextView textView2 = (TextView) view.findViewById(R.id.textView2);
- TextView textView3 = (TextView) view.findViewById(R.id.textView3);
- textView1.setText(list.get(position).FROMNAME);
- textView2.setText(list.get(position).TITLE);
- textView3.setText(list.get(position).SHOWTIME);
-
- ImageLoader.getInstance().displayImage(list.get(position).IMAGEURL, imageView,initOptions);
-
- return view;
- }
-
- }
5.实体类 Data1.class
- import java.util.ArrayList;
-
- public class Data1 {
- public ArrayList<MyData> data;
-
- public class MyData{
- public String FROMNAME;
- public String IMAGEURL;
- public String SHOWTIME;
- public String TITLE;
- }
-
- public ArrayList<MyData> getData() {
- return data;
- }
-
- public void setData(ArrayList<MyData> data) {
- this.data = data;
- }
-
- }
6.图片缓存工具类 ImageLoaderUtils.java
- import android.content.Context;
-
- import com.nostra13.universalimageloader.core.DisplayImageOptions;
- import com.nostra13.universalimageloader.core.ImageLoader;
- import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
- import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;
-
- public class ImageLoaderUtils {
- public static void initConfiguration(Context context) {
- Builder builder = new ImageLoaderConfiguration.Builder(context);
- ImageLoader.getInstance().init(builder.build());
- }
-
- public static DisplayImageOptions initOptions() {
- DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
- .showImageOnLoading(R.drawable.ic_launcher)
- .showImageForEmptyUri(R.drawable.ic_launcher)
- .cacheInMemory(true).cacheOnDisk(true).build();
- return displayImageOptions;
- }
- }
7. MyApplication.java
- import android.app.Application;
-
- public class MyApplication extends Application {
- public void onCreate() {
-
- ImageLoaderUtils.initConfiguration(getApplicationContext());
- };
- }
8. 工具类 StreamUtils.java
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
-
- public class StreamUtils {
- public static String parseSteam(InputStream inputStream) {
- try {
-
- ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
-
- byte[] buffer = new byte[1024];
-
- int len = 0;
- while ((len = inputStream.read(buffer)) != -1) {
-
- arrayOutputStream.write(buffer, 0, len);
- }
-
- return arrayOutputStream.toString("utf-8");
-
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
到这里,一个案例就结束啦,下面的两个主函数是其余两个网络请求方法,只是主函数代码不一样,其余的代码是相同的哦。
二.HttpURLConnection解析数据api
针对JDK中的URLConnection链接Servlet的问题,网上有虽然有所涉及,可是只是说明了某一个或几个问题,是以FAQ的方式来解决的,并且比较零散,如今对这个类的使用就本人在项目中的使用经验作以下总结:
1:> URL请求的类别:
分为二类,GET与POST请求。两者的区别在于:
a:) get请求能够获取静态页面,也能够把参数放在URL字串后面,传递给servlet,
b:) post与get的不一样之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。数组
请求响应流程
设置链接参数的方法
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setIfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
设置请求头或响应头
HTTP请求容许一个key带多个用逗号分开的values,可是HttpURLConnection只提供了单个操做的方法:缓存
- setRequestProperty(key,value)
- addRequestProperty(key,value)
setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的全部values,有清零从新赋值的做用。而addRequestProperty则是在原来key的基础上继续添加其余value。
发送URL请求
创建实际链接以后,就是发送请求,把请求参数传到服务器,这就须要使用outputStream把请求参数传给服务器:
获取响应
请求发送成功以后,便可获取响应的状态码,若是成功既能够读取响应中的数据,获取这些数据的方法包括:
- getContent
- getHeaderField
- getInputStream
对于大部分请求来讲,getInputStream和getContent是用的最多的。
相应的信息头用如下方法获取:
- getContentEncoding
- getContentLength
- getContentType
- getDate
- getExpiration
- getLastModifed
HttpURLConnection
任何网络链接都须要通过socket才能链接,HttpURLConnection不须要设置socket,因此,HttpURLConnection并非底层的链接,而是在底层链接上的一个请求。这就是为何HttpURLConneciton只是一个抽象类,自身不能被实例化的缘由。HttpURLConnection只能经过URL.openConnection()方法建立具体的实例。
虽然底层的网络链接能够被多个HttpURLConnection实例共享,但每个HttpURLConnection实例只能发送一个请求。请求结束以后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化链接没用。对于持久化链接,得用disconnect()方法关闭底层链接的socket。
1.主函数 MaActivity.class
**其余的代码在一种复制便可,是通用的**
三.XUtils解析数据 (记得降版本,版本高会报错)
1. 功能介绍
xUtils一个Android公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块。
-
View模块主要的功能是经过注解绑定UI,资源,事件。
-
Db模块是一个数据库orm框架, 简单的语句就能进行数据的操做。
-
Http模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。
-
Bitmap模块是加载图片以及图片的处理, 支持加载本地,网络图片。并且支持图片的内存和本地缓存。
(具体介绍在下面...)
1.主函数 MaActivity.class
- import java.util.ArrayList;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
-
- import com.bwie.test.Data1.MyData;
- import com.google.gson.Gson;
- import com.lidroid.xutils.HttpUtils;
- import com.lidroid.xutils.exception.HttpException;
- import com.lidroid.xutils.http.ResponseInfo;
- import com.lidroid.xutils.http.callback.RequestCallBack;
- import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
-
- public class MainActivity extends Activity {
-
- private EditText et_search;
- private ListView listView;
- private String trim;
- protected static final int SUCEESS = 0;
- private MyBaseAdapter adapter;
- ArrayList<MyData> myList = new ArrayList<MyData>();
-
- private Button bt_search;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- et_search = (EditText) findViewById(R.id.et_name);
- bt_search = (Button) findViewById(R.id.bt_search);
- listView = (ListView) findViewById(R.id.listView);
-
-
- bt_search.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- trim = et_search.getText().toString().trim();
- String path = "http://93.gov.cn/93app/get_search.do?key="
- + trim;
-
- getHttp(path);
- }
- });
- }
-
- protected void getHttp(String path) {
-
- HttpUtils utils = new HttpUtils();
- utils.send(HttpMethod.GET, path, new RequestCallBack<String>() {
-
- private MyBaseAdapter adapter;
-
- @Override
- public void onFailure(HttpException arg0, String arg1) {
-
-
- }
-
- @Override
- public void onSuccess(ResponseInfo<String> arg0) {
- String result = arg0.result;
- Gson gson = new Gson();
- Data1 bean = gson.fromJson(result, Data1.class);
- ArrayList<MyData> list = new ArrayList<MyData>();
- list.addAll(bean.data);
- if (adapter == null) {
-
- adapter = new MyBaseAdapter(MainActivity.this, list);
- } else {
- adapter.notifyDataSetChanged();
- }
- listView.setAdapter(adapter);
-
- }
- });
- }
-
- }
最后的配置必定不要忘记啦:
- android:name="com.bwie.test.MyApplication"
- android:name="android.permission.INTERNET"/>
到这里三个网络请求解析数据的案例就完工啦,下面是XUtils 的详细介绍:
2. 详细设计
2.1 View模块
2.1.1 整体设计
流程和关系较少, 请看下面的详细分析
2.1.2 流程图

2.1.3 核心类功能介绍
请先了解注解 ,动态代理 能够帮助到您, 若是已经了解请忽略。
注解和反射知识是这个模块的主要内容
1.ViewUtils.java
View和各类事件的注入以及资源的注入。
(1)主要函数
- private static void injectObject(Object handler, ViewFinder finder)
第一个参数Object handler表明的是须要注入的对象, 第二个参数是须要注入View(这个View就是handler的成员变量)所在的View或者Activity的包装对象。 该方法完成了View和各类事件的注入以及资源的注入。主要的原理就是经过反射和注解。
2.ViewFinder.java
(1)主要函数
- public View findViewById(int id, int pid)
- public View findViewById(int id)
若是存在父View, 优先从父View寻找,不然从当前的View或者Activity中寻找。
3.ResLoader.java
- public static Object loadRes(ResType type, Context context, int id)
获取资源文件值。支持多种资源的获取。
4.EventListenerManager.java
事件的注入, 其中的设计是经过动态代理。
- private final static DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object> listenerCache =
- new DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object>();
存放监听事件接口map。 由于有些接口有多个函数, 代理会判断事件接口是否存在, 若是存在只增长代理方法就够了, 避免从新设置监听事件接口。
- public static void addEventMethod(
- ViewFinder finder,
- ViewInjectInfo info,
- Annotation eventAnnotation,
- Object handler,
- Method method)
代理监听事件
5.注解类
2.2 Db模块
2.2.1 整体设计
流程和关系较少, 请看下面的详细分析
2.2.2 流程图

2.2.3 核心类功能介绍
注解、反射和数据库操做知识这个模块的主要内容
1.DbUtils.java
主要功能数据库的建立,数据库的增删改查。
- private static HashMap<String, DbUtils> daoMap = new HashMap<String, DbUtils>();
存放DbUtils实例对象的map,每一个数据库对应一个实例, key为数据库的名称。
- private synchronized static DbUtils getInstance(DaoConfig daoConfig)
采起的是单例模式,根据DaoConfig建立数据库, 中间还涉及到数据库升级。
delete;
findAll;
findById;
saveOrUpdate;// 当数据库没有时保存, 存在时修改。
update;
增删改查。
2.DaoConfig.java
private String dbName = "xUtils.db"; // default db name数据库名称
private int dbVersion = 1; //数据库版本
private DbUpgradeListener dbUpgradeListener; //升级监听事件
数据库配置类。
3.FindTempCache.java
在DbUtils的查询数据中
- @SuppressWarnings("unchecked")
- public <T> List<T> findAll(Selector selector) throws DbException {
- ....
-
- String sql = selector.toString();
- long seq = CursorUtils.FindCacheSequence.getSeq();
- findTempCache.setSeq(seq);
- Object obj = findTempCache.get(sql);
- if (obj != null) {
- return (List<T>) obj;
- }
-
- ...
- }
数据库查询数据的缓存。在查询中会优先调用缓存中的数据
4.SqlInfoBuilder.java
sql建表、增删改语句的组合。
- public static SqlInfo buildCreateTableSqlInfo(DbUtils db, Class<?> entityType)
- public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, Object idValue)
- public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, WhereBuilder whereBuilder)
- public static SqlInfo buildDeleteSqlInfo(DbUtils db, Object entity)
- public static SqlInfo buildInsertSqlInfo(DbUtils db, Object entity)
- public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, String... updateColumnNames)
- public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, WhereBuilder whereBuilder, String... updateColumnNames)
5.SqlInfo.java
sql语句和值包装对象。
6.Table.java
表对象。
7.Column.java
表中列对象。
8.Id.java
表对应的主键对象。
9.Selector.java
sql查询语句的组合。
10.WhereBuilder.java
sql条件语句的组合。
2.3 Http模块
2.3.1 整体设计

2.3.2 流程图

2.3.3 类图

1.HttpUtils.java
支持异步同步访问网络数据, 断点下载文件。
- public final static HttpCache sHttpCache = new HttpCache();
- private final DefaultHttpClient httpClient;
- private final HttpContext httpContext = new BasicHttpContext();
- private final static PriorityExecutor EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);
- public HttpUtils(int connTimeout, String userAgent) {
-
- .....
-
- httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params);
- ....
-
-
- httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
- @Override
- public void process(org.apache.http.HttpRequest httpRequest, HttpContext httpContext) throws org.apache.http.HttpException, IOException {
- if (!httpRequest.containsHeader(HEADER_ACCEPT_ENCODING)) {
- httpRequest.addHeader(HEADER_ACCEPT_ENCODING, ENCODING_GZIP);
- }
- }
- });
-
- httpClient.addResponseInterceptor(new HttpResponseInterceptor() {
- @Override
- public void process(HttpResponse response, HttpContext httpContext) throws org.apache.http.HttpException, IOException {
- final HttpEntity entity = response.getEntity();
- if (entity == null) {
- return;
- }
- final Header encoding = entity.getContentEncoding();
- if (encoding != null) {
- for (HeaderElement element : encoding.getElements()) {
- if (element.getName().equalsIgnoreCase("gzip")) {
-
- response.setEntity(new GZipDecompressingEntity(response.getEntity()));
- return;
- }
- }
- }
- }
- });
- }
- private <T> HttpHandler<T> sendRequest(HttpRequest request, RequestParams params, RequestCallBack<T> callBack);
- public HttpHandler<File> download(HttpRequest.HttpMethod method, String url, String target,
- RequestParams params, boolean autoResume, boolean autoRename, RequestCallBack<File> callback);
2.HttpRequest.java
网络请求的包装类。 包括url, 访问请求方法, 参数值等。
3.RequestCallBack.java
完成数据请求回调接口。
4.HttpHandler.java
获取网络数据逻辑的实现。这里能够理解为系统内部AsyncTask。 访问网络数据处理流程图

5.HttpCache.java
网络数据的缓存,内部包含LruMemoryCache。在获取数据的时候会判断是否过时。
6.StringDownLoadHandler.java
handleEntity()
将网络io流转化为String。
7.FileDownLoadHandler.java
handleEntity()
将网络io流转化为File。
8.HttpException.java
统一异常
2.4 Bitmap模块
2.4.1 整体设计

2.4.2 流程图
请查看http模块
2.4.3 类图

1.BitmapUtils.java
图片的异步加载,支持本地和网络图片, 图片的压缩处理, 图片的内存缓存已经本地缓存。
- private BitmapGlobalConfig globalConfig;
- private BitmapDisplayConfig defaultDisplayConfig;
- public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack)
设置图片流程图

详细流程图

2.BitmapLoadTask.java
加载图片的异步任务。在doInBackground
中读取图片资源
3.BitmapCache.java
- private LruDiskCache mDiskLruCache;
- private LruMemoryCache<MemoryCacheKey, Bitmap> mMemoryCache;
(1)主要函数
- public Bitmap downloadBitmap(String uri, BitmapDisplayConfig config, final BitmapUtils.BitmapLoadTask<?> task)
- public Bitmap getBitmapFromMemCache(String uri, BitmapDisplayConfig config)
- public Bitmap getBitmapFromDiskCache(String uri, BitmapDisplayConfig config)
4.BitmapGlobalConfig.java
配置, 包括线程池, 缓存的大小。
- private String diskCachePath;
- private int memoryCacheSize = 1024 * 1024 * 4;
- private int diskCacheSize = 1024 * 1024 * 50;
- private final static PriorityExecutor BITMAP_LOAD_EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);
- private final static PriorityExecutor DISK_CACHE_EXECUTOR = new PriorityExecutor(2);
- private long defaultCacheExpiry = 1000L * 60 * 60 * 24 * 30;
- private BitmapCache bitmapCache;
5.BitmapDisplayConfig.java
- private BitmapSize bitmapMaxSize;
- private Animation animation;
- private Drawable loadingDrawable;
- private Drawable loadFailedDrawable;
- private Bitmap.Config bitmapConfig = Bitmap.Config.RGB_565;
6.DefaultDownloader.java
获取bitmap, 支持三种获取路径, 本地文件,资产文件, 和网络图片。
7.DefaultBitmapLoadCallBack.java
图片加载完成的的回调, 默认回调将获取的bitmap值传递给view。
3. 杂谈
和Volley框架相比
相同点:
-
1.采用了网络数据缓存机制。
-
2.经过handler进行线程通讯
不一样点:
-
Volley的Http请求在 android 2.3 版本以前是经过HttpClient ,在以后的版本是经过URLHttpConnection。xUtils都是经过HttpClient请求网络(bitmap模块图片下载是经过 URLHttpConnection)。 URLHttpConnection默认支持GZIP压缩,api操做简单。
-
2.Volley将Http请求数据先缓存进byte[], 而后是分配给不一样的请求转化为须要的格式。xUtils是直接转化为想要的格式。 Volley:扩展性好, 可是不能存在大数据请求,不然就OOM。xUtils:不缓存入byte[] 支持大数据的请求, 速度比Volley稍快,但扩展性就低。
-
4.Volley访问网络数据时直接开启固定个数线程访问网络, 在run方法中执行死循环, 阻塞等待请求队列。 xUtils是开启线程池来管理线程。
-
-
缓存失效策略, volley的全部网络数据支持从http响应头中控制是否缓存和读取缓存失效时间,每一个请求能够控制是否缓存和缓存失效时间。 Xutils网络数据请求是统一自定义缓存失效时间。