Volley網絡通訊框架

<LinearLayout 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" android:orientation="vertical" tools:context="org.mobiletrain.a7_3volley.MainActivity">

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="getString1" android:text="請求字符串"/>

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="getJsonObject" android:text="請求一個Json數據"/>

    <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity { private RequestQueue queue; private TextView tv; private ImageView iv; private String imageUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageUrl = "http://a.hiphotos.baidu.com/news/q%3D100/sign=e5edcefd9558d109c2e3adb2e159ccd0/0ff41bd5ad6eddc4696319783edbb6fd536633a8.jpg"; queue = Volley.newRequestQueue(this); tv = ((TextView) findViewById(R.id.tv)); iv = ((ImageView) findViewById(R.id.iv)); } public void getString1(View view) { //若是不指定請求方式,默認爲Get請求
        StringRequest request = new StringRequest("http://www.baidu.com", new Response.Listener<String>() { //當請求成功時回調該方法
 @Override public void onResponse(String response) { tv.setText(response); Log.d("lenve", "onResponse: response:" + response); } }, new Response.ErrorListener() { //請求失敗時回調
 @Override public void onErrorResponse(VolleyError error) { } }); //將請求添加到隊列中去
 queue.add(request); } public void getJsonObject(View view) { //第二參數表示傳遞給服務器的參數,若是第二參數爲null,即不須要給服務端傳遞參數,此時的請求方式爲get請求,不然爲post請求
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.tngou.net/api/food/classify", null, new Response.Listener<JSONObject>() { //請求成功時回調的方法
 @Override public void onResponse(JSONObject response) { StringBuffer result = new StringBuffer(); try { JSONArray tngou = response.getJSONArray("tngou"); for (int i = 0; i < tngou.length(); i++) { result.append(tngou.getJSONObject(i).getString("name") + "\n"); } tv.setText(result.toString()); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(jsonObjectRequest); } public void getJsonArray(View view) { //請求JsonArray數據
        JsonArrayRequest arrayRequest = new JsonArrayRequest("http://www.tngou.net/api/food/classify", new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d("lenve", "onResponse: " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("lenve", "onErrorResponse: error:" + error.getMessage()); } }); queue.add(arrayRequest); } public void getImage(View view) { //1.圖片地址 //2.圖片加載成功的回調 //3.圖片的最大寬度 //4.圖片的最大高度 //5.圖片縮放模仿 //6.加載圖片的色彩模式 //7.加載失敗時的回調
        ImageRequest imageRequest = new ImageRequest(imageUrl, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { iv.setImageBitmap(response); } }, 200, 200, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(imageRequest); } public void imageloader(View view) { BitmapCache imageCache = new BitmapCache(this); //1.請求隊列 //2.圖片緩存工具類
        ImageLoader imageLoader = new ImageLoader(queue, imageCache); //1.顯示下載圖片的ImageView控件 //2.默認圖片 //3.下載出錯時顯示的圖片
        ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(iv, R.mipmap.ic_launcher, R.mipmap.ic_launcher); //1.請求的圖片地址 //2.監聽器
 imageLoader.get(imageUrl, imageListener); } }
public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String, Bitmap> lruCache; private Context context; public BitmapCache(Context context) { this.context = context; int maxMemory = (int) Runtime.getRuntime().maxMemory(); int maxSize = maxMemory / 8; lruCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; } @Override public Bitmap getBitmap(String url) { Bitmap bitmap = lruCache.get(subUrl(url)); if (bitmap != null) { return bitmap; } else { bitmap = getBitmapFromSDCard(subUrl(url)); if (bitmap != null) { lruCache.put(subUrl(url), bitmap); } return bitmap; } } private Bitmap getBitmapFromSDCard(String s) { return BitmapFactory.decodeFile(context.getExternalCacheDir().getAbsolutePath() + File.separator + s); } private String subUrl(String url) { return url.substring(url.lastIndexOf("/") + 1, url.length()); } @Override public void putBitmap(String url, Bitmap bitmap) { lruCache.put(subUrl(url), bitmap); saveBitmap2SDCard(subUrl(url), bitmap); } private void saveBitmap2SDCard(String url, Bitmap bitmap) { //若是SD卡中已經有了圖片,則不須要再保存
        Bitmap bitmapFromSDCard = getBitmapFromSDCard(url); if (bitmapFromSDCard != null) { return; } BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream(new File(context.getExternalCacheDir(), url))); if (url.toLowerCase().contains(".png")) { //若是第一個參數爲PNG,第二個參數無心義
                bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos); } else { //若是第一個參數爲JPEG,則第二個參數會影響圖片的質量,第二個參數取值(0~100),值越大,圖片質量越高
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

 使用步驟:android

第一步:建立請求隊列(通常建立一次便可)RequestQueue mQueue = Volley.newRequestQueue(this); 
第二步:根據業務須要建立一個請求json

StringRequest sr = new StringRequest(XXX); JsonObjectRequest jsonReq = new JsonObjectRequest(XXX); JsonArrayRequest arrayRequest = new JsonArrayRequest(XXX); ImageRequest imageRequest = new ImageRequest(XXX); ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache()); ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher); imageLoader.get(IMAGEURL, listener); ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache()); networkImageView.setImageUrl(IMAGEURL,imageLoader);

第三步:將請求加入到請求隊列中
mQueue.add(對象);api

Volley和Okhttp的區別緩存

Volley支持併發網絡鏈接,支持同時取消單個或多個請求,還能夠輕鬆的發送異步請求來填充UI數據。擁有請求任務隊列管理,適合小而頻繁的請求。對於請求大數據,好比下載文件,Volley不太合適服務器

Okhttp使用線程池技術減小請求的延遲,無縫的支持GZIP來減小數據流量,緩存響應數據來減小重複的網絡請求。並且彌補了Volley的不足,好比,Volley默認不支持文件的上傳,而Okhttp提供了多文件上傳功能網絡

Okhttp缺點:消息回來須要切到主線程,主線程要本身去寫,第二傳入調用比較複雜併發

相關文章
相關標籤/搜索