从服务端加载图片(Volley框架+Gson框架)

服务端代码–web.xml配置文件省略了(这些不是重点)

ShopInfo.java(为了节俭空间get、set、toString、构造器省略了)

private String name;private String img;ShopListServlet.javapackage com.atguigu.dianpin_server.servlet;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.google.gson.Gson;/** * 获取分页ShopList的json字符串 */public class ShopListServlet extends HttpServlet {// 定义ShopInfo的集合private List<ShopInfo> infos;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {init();// count的请求参数int count = Integer.parseInt(request.getParameter("count"));// 从集合中取当前请求页的数据集合List<ShopInfo> data = new ArrayList<ShopInfo>();for (int i = 0; i < count; i++) {data.add(infos.get(i));}// 转换为json字符串String json = new Gson().toJson(data);// 写到客户端response.setContentType("text/json;charset=utf-8");response.getWriter().write(json);// 格式:[{"name":"商铺名称1",// "img":"f1.jpg"},{"name":"商铺名称2","img":"f12.jpg"}]}public void init() {if (infos == null) {// 创建ShopInfo的集合infos = new ArrayList<ShopInfo>();// 得到/image的真实路径String imagesPath = getServletContext().getRealPath("/image");// 创建指向图片的对象File dirFile = new File(imagesPath);// 得到file对象的数组File[] files = dirFile.listFiles();// 遍历for (int i = 0; i < files.length; i++) {// 将图片信息封装为一个shopinfo对象, 并保存到集合中String imageName = files[i].getName();String name = "商铺名称 " + (i + 1);infos.add(new ShopInfo(name, imageName));}}}}—————————————我是分割线——————————————————————————

首先贴出布局文件

activity_main.xml

<FrameLayout xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent" ><ListViewandroid:id="@+id/lv_main"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView><ProgressBarandroid:id="@+id/pb_main"style="?android:attr/progressBarStyleLarge"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"/></FrameLayout>list_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="fill_parent"android:layout_height="100dp"android:orientation="horizontal"android:gravity="center_vertical"><com.android.volley.toolbox.NetworkImageViewandroid:id="@+id/iv_img"android:layout_width="90dp"android:layout_height="90dp"/><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="描述文本"android:layout_marginLeft="20dp"android:textSize="20sp"/></LinearLayout>接下来看android代码

ShopInfo.java

(为了节俭空间get、set、toString、构造器android代码也省略了)

本类是将从服务端得到的json数组中的每个元素json对象封装为ShopInfo对象

private String name;private String img;

VolleyTool.java

本案例需要Volley框架进行联网操作获取数据–这里提供一个工具类package com.atguigu.day03_test;import android.content.Context;import android.graphics.Bitmap;import android.support.v4.util.LruCache;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.ImageLoader.ImageCache;import com.android.volley.toolbox.Volley;public class VolleyTool {//初始化请求队列、图片加载器private RequestQueue queue;private ImageLoader imageLoader;//私有静态实例private static VolleyTool instance;//私有构造方法private VolleyTool(Context context) {//创建请求队列queue = Volley.newRequestQueue(context);//创建图片加载器imageLoader = new ImageLoader(queue, new LruImageCache());}//公共、静态的方法public static VolleyTool getInstance(Context context) {if (instance == null) {instance = new VolleyTool(context);}return instance;}//得到请求队列public RequestQueue getQueue() {return queue;}//得到图片加载器public ImageLoader getImageLoader() {return imageLoader;}/** * 使用LRU回收算法的缓存类 */class LruImageCache implements ImageCache {// 缓存容器private LruCache<String, Bitmap> cache;public LruImageCache() {// 计算缓存的最值int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);//创建缓存对象实例cache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap value) {// 返回bitmap占用的内存大小return value.getRowBytes() * value.getHeight();}};}// 从缓存中取图片对象@Overridepublic Bitmap getBitmap(String url) {return cache.get(url);}// 将图片对象保存到缓存容器中@Overridepublic void putBitmap(String url, Bitmap bitmap) {cache.put(url, bitmap);}}}MainActivity.java<pre name="code" class="java">package com.atguigu.day03_test;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.Response.Listener;import com.android.volley.VolleyError;import com.android.volley.toolbox.JsonArrayRequest;import com.android.volley.toolbox.NetworkImageView;import com.android.volley.toolbox.StringRequest;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;public class MainActivity extends Activity {private ListView lv_main;private ProgressBar pb_main;//请求队列RequestQueue requestQueue;//存放数据对象的集合private List<ShopInfo> data = new ArrayList<ShopInfo>();//适配器private MainAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//找到对应的视图资源文件lv_main = (ListView) findViewById(R.id.lv_main);pb_main = (ProgressBar) findViewById(R.id.pb_main);//获取请求队列requestQueue = VolleyTool.getInstance(getApplicationContext()).getQueue();//为适配器准备加载服务端的数据loadData();}private void loadData() {String url = ":8090/dianpin_03/ShopListServlet?count=30";/*注释部分是原始的解析方法 * new JsonArrayRequest(url, new Response.Listener<JSONArray>() {@Overridepublic void onResponse(JSONArray response) {for (int i = 0; i < response.length(); i++) {try {JSONObject jsonObject = response.getJSONObject(i);String name = jsonObject.getString("name");String img = jsonObject.getString("img");data.add(new ShopInfo(name, img));} catch (JSONException e) {e.printStackTrace();}}}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});*///创建一个请求Request request = new StringRequest(url, new Listener<String>() {@Overridepublic void onResponse(String response) {//将服务器端的json数组解析为ShopInfo对象集合data = new Gson().fromJson(response, new TypeToken<List<ShopInfo>>(){}.getType());adapter = new MainAdapter();<span style="white-space:pre"></span>//设置适配器lv_main.setAdapter(adapter);pb_main.setVisibility(View.GONE);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});//将请求添加到队列中, 自动处理requestQueue.add(request);}class MainAdapter extends BaseAdapter {@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = View.inflate(getApplicationContext(),R.layout.list_item, null);holder.imageView = (NetworkImageView) convertView.findViewById(R.id.iv_img);holder.textView = (TextView) convertView.findViewById(R.id.tv_name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}ShopInfo shopInfo = data.get(position);holder.textView.setText(shopInfo.getName());//设置未加载默认图片holder.imageView.setDefaultImageResId(R.drawable.default_icon);//设置加载异常的图片holder.imageView.setErrorImageResId(R.drawable.error);String url = ":8090/dianpin_03/image/"+shopInfo.getImg();holder.imageView.setImageUrl(url, VolleyTool.getInstance(getApplicationContext()).getImageLoader());return convertView;}class ViewHolder {NetworkImageView imageView;TextView textView;}}}

,痛苦留给的一切,请细加回味!苦难一经过去,苦难就变为甘美。

从服务端加载图片(Volley框架+Gson框架)

相关文章:

你感兴趣的文章:

标签云: