一、Volley
a burst or emission of many things or a large amount at once
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
二、特点
异步任务下载图片的操作存在几个问题
1、 代码量大且繁琐
2、 ListView滚动太快,可能导致下载的图片无法正常显示
3、 可能浪费系统资源
4、 旋转屏幕可能导致再次下载
由此提出使用Volley替代 网络操作
但是只适合简单的网络操作:
1、 json/xml文本数据
2、 图片加载
不能用于大数据的下载 和 文件的上传
三、使用前准备
找到volley文件 (sdk版本文件下com/android/volley)
将volley文件内的内容(所有文件)复制到项目com.android.volley包下
删除类名带有Text 的测试java文件
四、下载文本数据的方法
1、StringRequest
1 package com.xqx.volleydemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.TextView; 6 7 import com.android.volley.RequestQueue; 8 import com.android.volley.Response; 9 import com.android.volley.toolbox.JsonArrayRequest; 10 import com.android.volley.toolbox.StringRequest; 11 import com.android.volley.toolbox.Volley; 12 13 public class MainActivity extends Activity { 14 15 //1、声明RequestQueue 16 private RequestQueue requestQueue; 17 private TextView tv_show; 18 @Override 19 public void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 String url = "http://ikft.house.qq.com/index.php?guid=866500021200250&devua=appkft_1080_1920_XiaomiMI4LTE_1.8.3_Android19&order=0&searchtype=normal&devid=866500021200250&appname=QQHouse&mod=appkft&act=searchhouse&channel=71&page=1&rn=20&cityid=1"; 23 tv_show = (TextView) findViewById(R.id.tv_show); 24 //2、实例化RequestQueue对象 25 requestQueue = Volley.newRequestQueue(this); 26 //下载数据,返回字符串格式的数据 27 StringRequest request = new StringRequest(url, new Response.Listener<String>() { 28 @Override 29 public void onResponse(String response) { 30 //得到字符串数据response 31 tv_show.setText(response); 32 } 33 }, null); 34 //3、将请求添加到队列中 35 requestQueue.add(request); 36 } 37 38 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 8 <TextView 9 android:layout_gravity="center" 10 android:gravity="center" 11 android:layout_width="fill_parent" 12 android:layout_height="wrap_content" 13 android:text="下载的内容" 14 android:id="@+id/tv_show" 15 /> 16 17 18 </FrameLayout>
2、JsonObjectRequest
1 JsonObjectRequest request=new JsonObjectRequest(Method.GET, url, null, 2 new Response.Listener<JSONObject>() { 3 @Override 4 public void onResponse(JSONObject response) { 5 // TODO 请求成功 6 try { 7 JSONArray array=response.getJSONArray("data"); 8 parseJson(array); 9 } catch (JSONException e) { 10 e.printStackTrace(); 11 } 12 13 } 14 }, new Response.ErrorListener() { 15 @Override 16 public void onErrorResponse(VolleyError error) { 17 // TODO Auto-generated method stub 18 Toast.makeText(getApplicationContext(), "请求出错", 0).show(); 19 } 20 });
五、加载图片的方法
1、ImageRequest
1 package com.xqx.volleydemo; 2 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.os.Bundle; 6 import android.widget.ImageView; 7 8 import com.android.volley.RequestQueue; 9 import com.android.volley.Response; 10 import com.android.volley.VolleyError; 11 import com.android.volley.toolbox.ImageRequest; 12 import com.android.volley.toolbox.Volley; 13 14 public class MainActivity extends Activity { 15 //1、声明RequestQueue 16 private RequestQueue requestQueue; 17 private ImageView img_show; 18 @Override 19 public void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 img_show = (ImageView) findViewById(R.id.img_show); 23 //2、实例化RequestQueue对象 24 requestQueue = Volley.newRequestQueue(this); 25 //加载图片 26 ImageRequest request = new ImageRequest("http://www.baidu.com/img/bd_logo.png", 27 new Response.Listener<Bitmap>() { 28 @Override 29 public void onResponse(Bitmap response) { 30 //图片下载成功后回调此方法 31 //TODO 设置ImageView 32 img_show.setImageBitmap(response); 33 } 34 }, 35 //内存中Bitmap最大的宽度,高度限制,用于降低内存的消耗 36 128, 64, 37 //告诉BitmapFactory 在生产Bitmap的时候一个像素包含的信息 38 Bitmap.Config.ARGB_8888, 39 //图片加载失败的时候回调 40 new Response.ErrorListener() { 41 @Override 42 public void onErrorResponse(VolleyError error) { 43 //TODO 显示加载失败的图片 44 img_show.setImageResource(R.drawable.ic_launcher); 45 } 46 } 47 ); 48 //3、将请求添加到队列中 49 requestQueue.add(request); 50 } 51 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 8 9 <ImageView 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:id="@+id/img_show" 13 /> 14 </FrameLayout>
2、ImageLoader
1 package com.xqx.volleydemo; 2 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.os.Bundle; 6 import android.util.LruCache; 7 import android.widget.ImageView; 8 9 import com.android.volley.RequestQueue; 10 import com.android.volley.toolbox.ImageLoader; 11 import com.android.volley.toolbox.Volley; 12 13 public class MainActivity extends Activity { 14 15 //1、声明RequestQueue 16 private RequestQueue requestQueue; 17 private ImageLoader imageloder; 18 private ImageView imgView; 19 @Override 20 public void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 imgView = (ImageView) findViewById(R.id.img_show); 24 25 26 imageloder = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { 27 28 private LruCache<String,Bitmap> cache = new LruCache<>(10); 29 30 @Override 31 public Bitmap getBitmap(String url) { 32 33 return cache.get(url); 34 } 35 36 @Override 37 public void putBitmap(String url, Bitmap bitmap) { 38 cache.put(url,bitmap); 39 } 40 }); 41 imageloder.get("http://www.baidu.com/img/bd_logo.png" 42 , ImageLoader.getImageListener(imgView,R.drawable.ic_launcher, 43 android.R.drawable.ic_media_pause)); 44 } 45 46 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 8 9 <ImageView 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:id="@+id/img_show" 13 /> 14 </FrameLayout>