转载请注明出处:http://blog.csdn.net/joker_ya/article/details/40678429

OK!昨晚研究了一晚上了如何从后台传送数据到Android虚拟机的实现。皇天不负苦心人,终于在二十三点半时成功运行起来了。所以今天就迫不及待的想和大家分享一下。


首先说说本次实验所需要的一些jar包和工具:

1.gson.jar包--附上下载地址:http://download.csdn.net/detail/joker_ya/8107767

2.volley.jat包--附上下载地址:http://download.csdn.net/detail/joker_ya/8107771

3.MyEclipse8.5(作为后台)和Eclipse(做Android应用)


工具和jar包准备好后,接下来就是写后台了。我们打开MyEclipse并创建名为HouTai的Web Project项目。

(1)在项目的WebRoot-->WEB-INF-->lib目录下导入我们的gson.jar包;

(2)在WebRoot目录新建名为img的文件夹,并放入一些图片资源。

目录如下:

首先我们在com.joker.domain包下新建Girl类,表示一个对象,用于转换为json格式的数据:

[java]  view plain  copy
  1. package com.joker.domain;  
  2.   
  3. /** 
  4.  * @author Joker_Ya 
  5.  */  
  6. public class Girl {  
  7.     private int id;  
  8.     private String name;  
  9.     private String image;  
  10.   
  11.     /* 
  12.      * set和get方法 
  13.      */  
  14.     public int getId() {  
  15.         return id;  
  16.     }  
  17.   
  18.     public void setId(int id) {  
  19.         this.id = id;  
  20.     }  
  21.   
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.     public String getImage() {  
  31.         return image;  
  32.     }  
  33.   
  34.     public void setImage(String image) {  
  35.         this.image = image;  
  36.     }  
  37.   
  38.     @Override  
  39.     public String toString() {  
  40.         return "People [id=" + id + ", image=" + image + ", name=" + name + "]";  
  41.     }  
  42.   
  43. }  


接下来在com.joker.servlet包下新建GetDataServlet的serlet,实现数据的转换:

[java]  view plain  copy
  1. package com.joker.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. import com.google.gson.Gson;  
  12. import com.joker.domain.Girl;  
  13.   
  14. /** 
  15.  * @author Joker_Ya 
  16.  */  
  17. public class GetDataServlet extends HttpServlet {  
  18.   
  19.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  20.             throws ServletException, IOException {  
  21.         // 获得Gson对象  
  22.         Gson gson = new Gson();  
  23.         /* 
  24.          * 模拟从数据库获得数据 
  25.          */  
  26.         List<Girl> girls = new ArrayList<Girl>();  
  27.         for (int i = 1; i <= 6; i++) {  
  28.             Girl girl = new Girl();  
  29.             girl.setId(i);  
  30.             girl.setName("girl" + i);  
  31.             /* 
  32.              * request.getContextPath()获得该项目的根路径 即 “/HouTai” 获得图片的路径 
  33.              * 即相当于“/HouTai/img/girl.jpg”循环读取图片的路径 
  34.              * request.getContextPath()+"/img/girl"+i+".jpg" 
  35.              */  
  36.             girl.setImage(request.getContextPath() + "/img/girl" + i + ".jpg");  
  37.             girls.add(girl);  
  38.         }  
  39.         // 调用gson.toJson()传入一个对象,返回为该对象转换为json格式的字符串  
  40.         String str = gson.toJson(girls);  
  41.         // 将str字符串放入request域中,key="data"  
  42.         request.setAttribute("data""{\"data\":" + str + "}");  
  43.         // 跳转到index.jsp页面进行显示  
  44.         request.getRequestDispatcher("/index.jsp").forward(request, response);  
  45.     }  
  46.   
  47.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  48.             throws ServletException, IOException {  
  49.   
  50.     }  
  51.   
  52. }  

最后是index.jsp,该页面很简单,直接用el表达式输出request域中的数据:
[html]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <!-- 从request域中根据key=“data”获得数据 -->  
  3. ${data}  

好了,后台基本上就完成了。我们发布一下该工程,用浏览器访http://localhost:8080/HouTai/servlet/GetDataServlet看看效果吧:


然后我们再来看看该页面的源代码:


从上图中我们可以看到--第一行是空行,因此在编写Android应用中不要忘了对此做一些处理(去掉空格)。我们确实是把Girl对象转换为json格式并输出成功了。完美!


以上,后台我们基本上完成了。接下来就是写一个Android应用来测试一下后台传入的数据了。

打开Eclipse新建名为GetHouTaiDataDemo的Android应用,并在libs目录下导入volley.jat包。目录如下:

主界面就一个ListView,用于显示从后台传入的图片和数据。在此就不贴出来了。

主要的是MainActivity.Java

[java]  view plain  copy
  1. package com.example.gethoutaidatademo;  
  2.   
  3. import java.net.URI;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import org.apache.http.HttpResponse;  
  11. import org.apache.http.HttpStatus;  
  12. import org.apache.http.client.HttpClient;  
  13. import org.apache.http.client.methods.HttpGet;  
  14. import org.apache.http.impl.client.DefaultHttpClient;  
  15. import org.apache.http.util.EntityUtils;  
  16. import org.json.JSONArray;  
  17. import org.json.JSONObject;  
  18.   
  19. import com.android.volley.RequestQueue;  
  20. import com.android.volley.Response.ErrorListener;  
  21. import com.android.volley.Response.Listener;  
  22. import com.android.volley.VolleyError;  
  23. import com.android.volley.toolbox.ImageRequest;  
  24. import com.android.volley.toolbox.Volley;  
  25.   
  26. import android.support.v7.app.ActionBarActivity;  
  27. import android.graphics.Bitmap;  
  28. import android.graphics.Bitmap.Config;  
  29. import android.os.AsyncTask;  
  30. import android.os.Bundle;  
  31. import android.util.Log;  
  32. import android.view.LayoutInflater;  
  33. import android.view.View;  
  34. import android.view.ViewGroup;  
  35. import android.widget.BaseAdapter;  
  36. import android.widget.ImageView;  
  37. import android.widget.ListView;  
  38. import android.widget.TextView;  
  39.   
  40. /** 
  41.  * @author Joker_Ya 
  42.  */  
  43.   
  44. public class MainActivity extends ActionBarActivity {  
  45.     /* 
  46.      * 访问路径 
  47.      */  
  48.     private static final String BASEPATH = "http://222.17.106.37:8080";  
  49.     private static final String PATH = "http://222.17.106.37:8080/HouTai/servlet/GetDataServlet";  
  50.     // ListView  
  51.     private ListView mListView;  
  52.     private List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  53.     private Map<String, String> map;  
  54.     private RequestQueue queue;  
  55.   
  56.     @Override  
  57.     protected void onCreate(Bundle savedInstanceState) {  
  58.         super.onCreate(savedInstanceState);  
  59.         setContentView(R.layout.activity_main);  
  60.   
  61.         mListView = (ListView) findViewById(R.id.listview);  
  62.         // 得到一个RequestQueue对象  
  63.         queue = Volley.newRequestQueue(this);  
  64.         myAsyncTask task = new myAsyncTask();  
  65.         task.execute();// 异步线程执行  
  66.         MyAdapter adapter = new MyAdapter();  
  67.         mListView.setAdapter(adapter);  
  68.     }  
  69.   
  70.     /** 
  71.      * @author Joker_Ya MyAdapter继承BaseAdapter用于listview和数据的绑定 
  72.      */  
  73.     public class MyAdapter extends BaseAdapter {  
  74.   
  75.         @Override  
  76.         public int getCount() {  
  77.             // TODO Auto-generated method stub  
  78.             return list.size();  
  79.         }  
  80.   
  81.         @Override  
  82.         public Object getItem(int position) {  
  83.             // TODO Auto-generated method stub  
  84.             return list.get(position);  
  85.         }  
  86.   
  87.         @Override  
  88.         public long getItemId(int position) {  
  89.             // TODO Auto-generated method stub  
  90.             return position;  
  91.         }  
  92.   
  93.         @Override  
  94.         public View getView(int position, View convertView, ViewGroup arg2) {  
  95.             // TODO Auto-generated method stub  
  96.             final Viewholder holder;  
  97.             if (convertView == null) {  
  98.                 convertView = LayoutInflater.from(MainActivity.this).inflate(  
  99.                         R.layout.items, null);  
  100.                 // 获得Viewholder对象避免多次findView  
  101.                 holder = new Viewholder();  
  102.                 holder.mImageView = (ImageView) convertView  
  103.                         .findViewById(R.id.imageview);  
  104.                 holder.mTextView = (TextView) convertView  
  105.                         .findViewById(R.id.textview);  
  106.                 convertView.setTag(holder);  
  107.             } else {  
  108.                 holder = (Viewholder) convertView.getTag();  
  109.             }  
  110.             // 获得图片并显示在mImageView中  
  111.             ImageRequest request = new ImageRequest(BASEPATH  
  112.                     + list.get(position).get("image"), new Listener<Bitmap>() {  
  113.   
  114.                 @Override  
  115.                 public void onResponse(Bitmap response) {  
  116.                     // TODO Auto-generated method stub  
  117.                     holder.mImageView.setImageBitmap(response);  
  118.                 }  
  119.             }, 00, Config.ARGB_8888, new ErrorListener() {  
  120.   
  121.                 @Override  
  122.                 public void onErrorResponse(VolleyError error) {  
  123.                     // TODO Auto-generated method stub  
  124.   
  125.                 }  
  126.             });  
  127.             queue.add(request);  
  128.             holder.mTextView.setText(list.get(position).get("name"));  
  129.             return convertView;  
  130.         }  
  131.   
  132.         public class Viewholder {  
  133.             ImageView mImageView;  
  134.             TextView mTextView;  
  135.         }  
  136.     }  
  137.   
  138.     /** 
  139.      * @author Joker_Ya myAsyncTask继承AsyncTask 
  140.      */  
  141.     public class myAsyncTask extends AsyncTask<Void, Void, String> {  
  142.         /** 
  143.          * 用于异步下载数据 
  144.          */  
  145.         @Override  
  146.         protected String doInBackground(Void... arg0) {  
  147.             // TODO Auto-generated method stub  
  148.             String result = "";  
  149.             try {  
  150.                 HttpGet get = new HttpGet(new URI(PATH));  
  151.                 HttpClient client = new DefaultHttpClient();  
  152.                 HttpResponse response = client.execute(get);  
  153.                 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
  154.                     result = EntityUtils.toString(response.getEntity());  
  155.                     // 从后台获得的数据去掉空格  
  156.                     result = result.trim();  
  157.                     Log.v("++++++++++++", result);  
  158.                 }  
  159.             } catch (Exception e) {  
  160.                 // TODO Auto-generated catch block  
  161.                 e.printStackTrace();  
  162.             }  
  163.             return result;  
  164.         }  
  165.   
  166.         /** 
  167.          * 解析result(json格式的字符串)并将之存入到list中 
  168.          */  
  169.         @Override  
  170.         protected void onPostExecute(String result) {  
  171.             // TODO Auto-generated method stub  
  172.             String name = "";  
  173.             try {  
  174.                 JSONArray array = new JSONObject(result).getJSONArray("data");  
  175.                 for (int i = 0; i < array.length(); i++) {  
  176.                     JSONObject object = array.getJSONObject(i);  
  177.                     Iterator<?> iterator = object.keys();  
  178.                     map = new HashMap<String, String>();  
  179.                     while (iterator.hasNext()) {  
  180.                         name = iterator.next().toString();  
  181.                         map.put(name, object.getString(name));  
  182.                     }  
  183.                     list.add(map);  
  184.                 }  
  185.             } catch (Exception e) {  
  186.                 // TODO Auto-generated catch block  
  187.                 e.printStackTrace();  
  188.             }  
  189.             super.onPostExecute(result);  
  190.         }  
  191.     }  
  192. }  

本来是用HttpClient来访问路径的,写到一半时突然发现要访问图片,这就有点麻烦了。自己又懒得去改,因此导入了volley.jar包来获得图片。其实访问后台数据也可以用volley.jar包中的jsonRequest来获得json数据的,无奈自己太懒,就用 HttpClient和volley结合来用了。有点不伦不类了。大哭大哭


items.xml:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.     <ImageView   
  7.         android:id="@+id/imageview"  
  8.         android:layout_width="50dip"  
  9.         android:layout_height="50dip"  
  10.         />  
  11.     <TextView   
  12.         android:id="@+id/textview"  
  13.         android:layout_width="0dip"  
  14.         android:layout_weight="1"  
  15.         android:layout_height="50dip"  
  16.         />  
  17.   
  18. </LinearLayout>  

好了,Android端的应用我们也写好了。接下来就是测试看看效果了:

从图中可以看出我们确实是从后台中获得了资源并成功的显示了出来。到此,使用JavaWeb项目作为后台的实现大功告成。


最后的最后还是附上源码下载地址(包含HouTai的Web Project后台应用和GetHouTaiDataDemo的Android应用):

源码下载


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐