AsyncTask解析數據html
AsyncTask主要用來更新UI線程,比較耗時的操做能夠在AsyncTask中使用。java
AsyncTask是個抽象類,使用時須要繼承這個類,而後調用execute()方法。注意繼承時須要設定三個泛型Params,Progress和Result的類型,如AsyncTask<Void,Inetger,Void>:mysql
- Params是指調用execute()方法時傳入的參數類型和doInBackgound()的參數類型
- Progress是指更新進度時傳遞的參數類型,即publishProgress()和onProgressUpdate()的參數類型
- Result是指doInBackground()的返回值類型
上面的說明涉及到幾個方法:android
- doInBackgound() 這個方法是繼承AsyncTask必需要實現的,運行於後臺,耗時的操做能夠在這裏作
- publishProgress() 更新進度,給onProgressUpdate()傳遞進度參數
- onProgressUpdate() 在publishProgress()調用完被調用,更新進度
1.下面咱們來看看主函數的佈局:activity_main.xml,其中,這幾個方法除了主函數不同以外,其餘的代碼都同樣。sql
[html] view plain copy數據庫
- <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.xmlapache
[html] view plain copyapi
- <?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數組
[java] view plain copy緩存
- 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);
- // "http://93.gov.cn/93app/get_search.do?key=九三"
-
- bt_search.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- 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) {
- // TODO Auto-generated catch block
- 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
[java] view plain copy
- 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
- 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
[java] view plain copy
- 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
[java] view plain copy
- 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
[java] view plain copy
- import android.app.Application;
-
- public class MyApplication extends Application {
- public void onCreate() {
- //初始化操做
- ImageLoaderUtils.initConfiguration(getApplicationContext());
- };
- }
8. 工具類 StreamUtils.java
[java] view plain copy
- 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");
- // utf-8 大小寫均可以,gbk 必須大寫
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
到這裏,一個案例就結束啦,下面的兩個主函數是其餘兩個網絡請求方法,只是主函數代碼不一樣,其餘的代碼是相同的哦。
二.HttpURLConnection解析數據
針對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
[java] view plain copy
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- 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>();
- Handler handler = new Handler() {
- private MyBaseAdapter myBaseAdapter;
-
- public void handleMessage(android.os.Message msg) {
- if (msg.what == SUCEESS) {
- Data1 chatInfo = (Data1) msg.obj;
- // 展現到listView上邊 數據成功
-
- myList.addAll(chatInfo.data);
- if (myBaseAdapter == null) {
- myBaseAdapter = new MyBaseAdapter(MainActivity.this, myList);
- listView.setAdapter(myBaseAdapter);
- } else {
- myBaseAdapter.notifyDataSetChanged();
- }
- }
-
- };
- };
- 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);
- // "http://93.gov.cn/93app/get_search.do?key=九三"
-
- bt_search.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- trim = et_search.getText().toString().trim();
- String path = "http://93.gov.cn/93app/get_search.do?key="
- + trim;
- // 請求數據
- getHttp(path);
- }
- });
- }
-
- protected void getHttp(final String path) {
- // TODO Auto-generated method stub
- new Thread() {
- public void run() {
- try {
- // http://v.juhe.cn/weixin/query?key=您申請的KEY
- // 0917c812f187b92e025c9b7c2d4e59b5 pno
- URL url = new URL(path);
- HttpURLConnection openConnection = (HttpURLConnection) url
- .openConnection();
- openConnection.setConnectTimeout(5000);
- openConnection.setReadTimeout(5000);
- int responseCode = openConnection.getResponseCode();
- if (responseCode == 200) {
- InputStream inputStream = openConnection
- .getInputStream();
- String parseSteam = StreamUtils.parseSteam(inputStream);
- Gson gson = new Gson();
- Data1 weiChatInfo = gson.fromJson(parseSteam,
- Data1.class);
- // 展現到listView上
- handler.obtainMessage(SUCEESS, weiChatInfo)
- .sendToTarget();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- };
- }.start();
- }
106.}
**其餘的代碼在一種複製便可,是通用的**
三.XUtils解析數據 (記得降版本,版本高會報錯)
1. 功能介紹
xUtils一個Android公共庫框架,主要包括四個部分:View,Db, Http, Bitmap 四個模塊。
- View模塊主要的功能是經過註解綁定UI,資源,事件。
- Db模塊是一個數據庫orm框架, 簡單的語句就能進行數據的操做。
- Http模塊主要訪問網絡,支持同步,異步方式的請求,支持文件的下載。
- Bitmap模塊是加載圖片以及圖片的處理, 支持加載本地,網絡圖片。並且支持圖片的內存和本地緩存。
(具體介紹在下面...)
1.主函數 MaActivity.class
[java] view plain copy
- 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);
- // "http://93.gov.cn/93app/get_search.do?key=九三"
-
- bt_search.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- 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) {
- // TODO Auto-generated method stub
- HttpUtils utils = new HttpUtils();
- utils.send(HttpMethod.GET, path, new RequestCallBack<String>() {
-
- private MyBaseAdapter adapter;
-
- @Override
- public void onFailure(HttpException arg0, String arg1) {
- // TODO Auto-generated method stub
-
- }
-
- @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);
-
- }
- });
- }
-
- }
最後的配置必定不要忘記啦:
[java] view plain copy
- android:name="com.bwie.test.MyApplication"
[java] view plain copy
- android:name="android.permission.INTERNET"/>
到這裏三個網絡請求解析數據的案例就完工啦,下面是XUtils 的詳細介紹:
2. 詳細設計
2.1 View模塊
2.1.1 整體設計
流程和關係較少, 請看下面的詳細分析
2.1.2 流程圖
2.1.3 核心類功能介紹
請先了解註解 ,動態代理 能夠幫助到您, 若是已經瞭解請忽略。
註解和反射知識是這個模塊的主要內容
1.ViewUtils.java
View和各類事件的注入以及資源的注入。
(1)主要函數
[js] view plain copy
- private static void injectObject(Object handler, ViewFinder finder)
第一個參數Object handler表明的是須要注入的對象, 第二個參數是須要注入View(這個View就是handler的成員變量)所在的View或者Activity的包裝對象。 該方法完成了View和各類事件的注入以及資源的注入。主要的原理就是經過反射和註解。
- 完成Activity的setContentView。
- 完成View的注入。
- 完成資源的注入。
- 完成各類事件的注入。
2.ViewFinder.java
(1)主要函數
[js] view plain copy
- public View findViewById(int id, int pid)
- public View findViewById(int id)
若是存在父View, 優先從父View尋找,不然從當前的View或者Activity中尋找。
3.ResLoader.java
[js] view plain copy
- public static Object loadRes(ResType type, Context context, int id)
獲取資源文件值。支持多種資源的獲取。
4.EventListenerManager.java
事件的注入, 其中的設計是經過動態代理。
[js] view plain copy
- private final static DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object> listenerCache = new DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object>();
存放監聽事件接口map。 由於有些接口有多個函數, 代理會判斷事件接口是否存在, 若是存在只增長代理方法就夠了, 避免從新設置監聽事件接口。
[js] view plain copy
- 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
主要功能數據庫的建立,數據庫的增刪改查。
[js] view plain copy
- private static HashMap<String, DbUtils> daoMap = new HashMap<String, DbUtils>();
存放DbUtils實例對象的map,每一個數據庫對應一個實例, key爲數據庫的名稱。
[js] view plain copy
- 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的查詢數據中
[js] view plain copy
- @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建表、增刪改語句的組合。
[js] view plain copy
- 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
支持異步同步訪問網絡數據, 斷點下載文件。
[js] view plain copy
- //網絡數據的緩存。
- public final static HttpCache sHttpCache = new HttpCache();
- //訪問網絡的HttpClient。
- private final DefaultHttpClient httpClient;
- private final HttpContext httpContext = new BasicHttpContext();
- //線程池。
- private final static PriorityExecutor EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);
[js] view plain copy
- public HttpUtils(int connTimeout, String userAgent) {
- //配置超時時間,UserAgent, http版本信息協議等一些信息
- .....
- //將配置的參數統一放到httpClient中
- httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params);
- ....
-
- //下面這個關鍵,設置攔截器。 默認加上gizp壓縮。 經過gizp壓縮後的數據傳輸效率高不少。
- 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")) {
- //這裏判斷從服務器傳輸的數據是否須要經過gzip解壓。
- response.setEntity(new GZipDecompressingEntity(response.getEntity()));
- return;
- }
- }
- }
- }
- });
- }
[js] view plain copy
- //訪問網絡數據
- 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
圖片的異步加載,支持本地和網絡圖片, 圖片的壓縮處理, 圖片的內存緩存已經本地緩存。
[js] view plain copy
- private BitmapGlobalConfig globalConfig; // 線程池,緩存,和網絡的配置
- private BitmapDisplayConfig defaultDisplayConfig; //圖片顯示的配置
[js] view plain copy
- /**
- * @param container 表示須要顯示圖片的View
- * @param uri 圖片的uri
- * @param displayConfig 圖片顯示的配置
- * @param callBack 圖片加載的回調接口
- */
- public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack)
設置圖片流程圖
詳細流程圖
2.BitmapLoadTask.java
加載圖片的異步任務。在doInBackground中讀取圖片資源
3.BitmapCache.java
[js] view plain copy
- private LruDiskCache mDiskLruCache; //閃存緩存
- private LruMemoryCache<MemoryCacheKey, Bitmap> mMemoryCache; //運存緩存
(1)主要函數
[js] view plain copy
- //下載網絡圖片, 而後根據配置壓縮圖片, 將圖片緩存。
- public Bitmap downloadBitmap(String uri, BitmapDisplayConfig config, final BitmapUtils.BitmapLoadTask<?> task)
- //從運存緩存中讀取bitmap 在獲取的時候會判斷是否過時
- public Bitmap getBitmapFromMemCache(String uri, BitmapDisplayConfig config)
- //從閃存緩存中讀取bitmap
- public Bitmap getBitmapFromDiskCache(String uri, BitmapDisplayConfig config)
4.BitmapGlobalConfig.java
配置, 包括線程池, 緩存的大小。
[js] view plain copy
- //閃存緩存的路徑
- private String diskCachePath;
- //運存緩存的最大值
- private int memoryCacheSize = 1024 * 1024 * 4; // 4MB
- //閃存緩存的最大值
- private int diskCacheSize = 1024 * 1024 * 50; // 50M
- //從網絡加載數據的線程池
- private final static PriorityExecutor BITMAP_LOAD_EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);
- //從閃存讀取數據的線程池
- private final static PriorityExecutor DISK_CACHE_EXECUTOR = new PriorityExecutor(2);
- //bitmap緩存的的時間
- private long defaultCacheExpiry = 1000L * 60 * 60 * 24 * 30; // 30 days
- //bitmap緩存
- private BitmapCache bitmapCache;
5.BitmapDisplayConfig.java
[js] view plain copy
- //圖片顯示的大小
- 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進行線程通訊
不一樣點:
-
- 2.Volley將Http請求數據先緩存進byte[], 而後是分配給不一樣的請求轉化爲須要的格式。xUtils是直接轉化爲想要的格式。 Volley:擴展性好, 可是不能存在大數據請求,不然就OOM。xUtils:不緩存入byte[] 支持大數據的請求, 速度比Volley稍快,但擴展性就低。
- 4.Volley訪問網絡數據時直接開啓固定個數線程訪問網絡, 在run方法中執行死循環, 阻塞等待請求隊列。 xUtils是開啓線程池來管理線程。
- Volley的Http請求在 android 2.3 版本以前是經過HttpClient ,在以後的版本是經過URLHttpConnection。xUtils都是經過HttpClient請求網絡(bitmap模塊圖片下載是經過 URLHttpConnection)。 URLHttpConnection默認支持GZIP壓縮,api操做簡單。
- 緩存失效策略, volley的全部網絡數據支持從http響應頭中控制是否緩存和讀取緩存失效時間,每一個請求能夠控制是否緩存和緩存失效時間。 Xutils網絡數據請求是統一自定義緩存失效時間。