English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Explicación del problema: HttpClient y HttpUrlConnection, dos métodos de solicitud en el SDK de Android, se utilizan para manejar operaciones de red complejas, pero cuando la aplicación es bastante compleja, es necesario escribir un gran cantidad de código para manejar很多东西: caché de imágenes, programación de solicitudes, etc.
Solución: Volley se creó para resolver estos problemas, y con2013año Google I/En la conferencia O se propuso: hacer que las operaciones de red de las aplicaciones Android sean más fáciles y rápidas; abstractizó los detalles de la implementación de Http Client en la capa inferior, permitiendo que los desarrolladores se concentren más en la generación de solicitudes RESTful. Además, Volley ejecuta todas las solicitudes de forma asíncrona en diferentes hilos, evitando así el bloqueo de la línea principal.
Volley puede decirse que combina AsyncHttpClient y Universal-Image-Loader tiene todas las ventajas en uno, puede realizar comunicación HTTP tan sencilla como AsyncHttpClient, y también como Universal-Image-Loader es tan fácil de cargar imágenes de la red. Además de ser simple y fácil de usar, Volley también ha realizado una gran mejora en el rendimiento, su objetivo de diseño es muy adecuado para operaciones de red con pequeñas cantidades de datos pero comunicación frecuente, mientras que para operaciones de red con grandes cantidades de datos, como la descarga de archivos, el rendimiento de Volley será muy malo
1¿Cuáles son las características de Volley?
programación automática de solicitudes de red
múltiples conexiones de red concurrentes
Al usar el mecanismo estándar de caché HTTP para mantener la consistencia de la respuesta entre disco y memoria
Soporta la prioridad de solicitud
Soporta un poderoso API para cancelar solicitudes, que puede cancelar solicitudes individuales o múltiples
Facil de personalizar
Robustez: fácil de actualizar correctamente la UI y obtener datos
Incluye herramientas de depuración y seguimiento
2、RequestQueue y Request en Volley
● RequestQueue se utiliza para ejecutar la cola de solicitudes
● Request se utiliza para construir un objeto de solicitud
● Los objetos Request tienen los siguientes tipos principales:
a. StringRequest donde el cuerpo de la respuesta es una cadena
b. JsonArrayRequest para enviar y recibir arrays JSON
c. JsonObjectRequest para enviar y recibir objetos JSON
d. ImageRequest para enviar y recibir imágenes
3、Pasos para usar Volley:
(1)Crear un proyecto Android y importar el paquete jar de Volley
(2)Método de solicitud GET:
//Crear objeto RequestQueue RequestQueue requestQueue = Volley.newRequestQueue(this); String url = "http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android"; //Crear el objeto request StringRequest request = new StringRequest(url, new Response.Listener<String>() { /** * Resultado de la solicitud exitosa * @param response Este parámetro es el resultado del acceso a los datos de la red */ @Override public void onResponse(String response) { // } }, new Response.ErrorListener() { /** * Este método se utiliza para escuchar errores de acceso, mostrar los resultados * 07-19 04:17:13.414: E/tag(1181): ------------- * com.android.volley.VolleyError: * java.lang.SecurityException: * Permiso denegado (falta el permiso INTERNET?========================== */ @Override public void onErrorResponse(VolleyError error) { Log.e("tag","-------------"+ error+"=========================="); } }); //Añadir el objeto Request a la RequestQueue. requestQueue.add(request);
(3Método de solicitud Post:
Al especificar el método de solicitud como Request.Method.POST, se convierte en una solicitud POST, luego se reconfigura el método getParams para establecer los parámetros de solicitud. Cuando se realiza una solicitud POST, Volley intenta llamar al método getParams() del padre de StringRequest, Request, para obtener los parámetros POST.
//Crear objeto RequestQueue RequestQueue requestQueue = Volley.newRequestQueue(this); String url="http://api.m.panda.tv/ajax_get_all_subcate”; StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { Log.e("tag", "Éxito de solicitud============"+response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("tag", "Éxito de solicitud============"+error); } }){ /** * Sobrescribe el método getParams para configurar los parámetros, método para agregar parámetros en el POST */ @Override protected Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> params = new HashMap<String,String>(); params.put("__version", "1.0.1.1300"); params.put("__plat", "android"); return params; } }; requestQueue.add(request);
(3Método de carga de imágenes:
Primera forma de cargar imágenes
RequestQueue requestQueue = Volley.newRequestQueue(context); String img = datas.getImg(); //Los terceros y cuartos parámetros se utilizan respectivamente para especificar el ancho y la altura máximos permitidos de la imagen. Si el ancho o la altura de la imagen de red especificada aquí es mayor que este valor máximo, se comprimirá la imagen. Si se especifica 0, significa que no se realizará la compresión independientemente de la dimensión de la imagen. //El quinto parámetro se utiliza para especificar las propiedades de color de la imagen ImageRequest request=new ImageRequest(img, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { holder.iv.setImageBitmap(response); } }, 0, 0,Bitmap.Config.ARGB_8888, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generado por el método de plantilla } }); requestQueue.add(request);
Segundo método de carga de imágenes
En realidad, la función de carga de imágenes es mucho más que esto, ImageLoader puede realizar el almacenamiento en caché de imágenes y还可以过滤重复链接,避免发送重复的请求
El uso de ImageLoader se resume en los siguientes pasos
1. Crear un objeto RequestQueue.
2. Crear un objeto ImageLoader.
3. Obtiene un objeto ImageListener.
4. Llama al método get() de ImageLoader para cargar imágenes de la red.
//hereda ImageCache, utiliza LruCache para implementar el almacenamiento en caché public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = 10 * 1024 * 1024; mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes(); * bitmap.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { return mCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { mCache.put(url, bitmap); } } private void getImageByImageLoader() { ImageView iv= (ImageView) findViewById(R.id.iv); RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "https://www.baidu.com/img/bdlogo.png"; ImageLoader loader=new ImageLoader(queue,new BitmapCache() ); // El primer parámetro especifica el controlador ImageView utilizado para mostrar la imagen // El segundo parámetro especifica la imagen que se muestra durante el proceso de carga de la imagen // El tercer parámetro especifica la imagen que se muestra cuando la carga de la imagen falla ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.drawable.ic_launcher,R.drawable.ic_launcher); // Llame al método get() de ImageLoader para cargar la imagen // El primer parámetro es la dirección URL de la imagen // El segundo parámetro es el objeto ImageListener obtenido recientemente // Si desea limitar el tamaño de la imagen, también puede usar el método overload de get(), especificando el ancho y la altura máximos permitidos de la imagen, es decir, especificando a través de los terceros y cuartos parámetros loader.get(url,listener); }
Tercera forma de cargar imágenes
Finalmente, Volley proporciona una forma personalizada de ImageView para cargar imágenes, que se puede resumir como
1. Crear un objeto RequestQueue.
2. Crear un objeto ImageLoader.
3. Añadir un controlador NetworkImageView en el archivo de diseño.
4. Obtener la instancia del controlador en el código.
5. Establecer la dirección de la imagen a cargar.
Paso uno: Declarar el controlador en el diseño
<com.android.volley.toolbox.NetworkImageView android:id="@"+id/network_image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" />
Paso dos: Implementar la carga en el programa
public void networkImageView(){ RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); ImageLoader loader=new ImageLoader(queue,new BitmapCache() ); NetworkImageView niv= (NetworkImageView) findViewById(R.id.network_image_view); niv.setDefaultImageResId(R.drawable.ic_launcher);//Establecer la imagen que se muestra mientras se carga niv.setErrorImageResId(R.mipmap.ic_launcher);//Establecer la imagen que se muestra cuando la carga falla niv.setImageUrl("https://www.baidu.com/img/bdlogo.png", loader);//Establecer la dirección URL de la imagen de destino }
4、Personalizar Request
. En aplicaciones prácticas, a menudo es necesario integrar solicitudes HTTP con JSON, y Volley admite exactamente este tipo de integración, aunque necesitamos personalizar nuestra propia solicitud, aquí utilizamos la biblioteca Gson de Google para la integración.
1. Heredar la clase Request
2. Redefinir parseNetworkResponse para realizar la conversión de json a la clase de entidad, ya que la clase de entidad no está definida, se utiliza un tipo genérico
La cadena JSON utilizada a continuación es:
{"name":"lizhangqu","age":16}
Paso uno:
paquete cn.edu.zafu.http; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import com.google.gson.Gson; import java.io.UnsupportedEncodingException; /** * Creado por lizhangqu el 2015/5/7. */ public class GsonRequest<T> extends Request<T> { private final Response.Listener<T> mListener; private Gson mGson; private Class<T> mClass; public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener, Response.ErrorListener errorListener) { super(method, url, errorListener); mGson = new Gson(); mClass = clazz; mListener = listener; } public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener, Response.ErrorListener errorListener) { this(Method.GET, url, clazz, listener, errorListener); } @Override protegido Response<T> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } } @Override protegido void deliverResponse(T response) { mListener.onResponse(response); } }
Paso dos: escribir la clase de entidad de prueba, con dos campos, uno name y otro age
paquete cn.edu.zafu.http; /** * Creado por lizhangqu el 2015/5/7. */ public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + "\' + ", age=" + age + '}'; } }
Paso tres: la llamada al método es igual que StringRequest. Como se muestra a continuación
private void json(){ RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "http://121.41.119.107/test/index.php"; GsonRequest<Person> request=new GsonRequest<Person>(url, Person.class, new Response.Listener<Person>() { @Override public void onResponse(Person response) { Log.d("TAG",response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(request); }
Lo que se ha mencionado anteriormente es la introducción del uso del framework Volley en Android para realizar solicitudes de datos de red por parte del editor. Espero que sea útil para todos. Si tienen alguna pregunta, déjenme un mensaje y el editor responderá a tiempo. También agradezco muchísimo el apoyo de todos a la página web de呐喊教程!
Declaración: El contenido de este artículo se ha obtenido de la red, y pertenece al propietario original. El contenido ha sido contribuido y subido por usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de infracción.