小武:相信你們都用過網絡請求解析數據,只是方法不同而已,可是,邏輯都是差很少的: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網絡數據請求是統一自定義緩存失效時間。