Android之使用json进行网络数据交换
JSON作为一种轻量级的数据交换格式,凭借其易于阅读和编写、易于解析、传输速度快等优点流行了起来。最近正好在学习Android端从服务端端取数据,Json便派上了用场。好,下面开始切入主题。
1.准备好服务端
首先我们要有个服务器,我用的是Tomcat7.0,这里具体Tomcat的安装过程我就不加以描述了。服务器配置过程如下。
我们在File-new -other中找到server,next然后在Apache中找到tomcat7.0,我这里将server的名字改为了Myserve,点击finish。
完成上诉步骤后可以看到Package Explorer中出现了Servers项目,打开里面有个Myserver-config,同时这就是我先前配置的服务器。
第二步。建立Web项目。同样在new-other-web中找到Dynamic Web Project,点击next,我这里为项目取名ServletText,记得讲Target runtime改为Tomcat7.0。
别急着finish,点两下next后可以看见有个框没打钩,那是提示是否生成web.xml用的,大家可根据项目中实际需求是否勾选,我们这里不予理会,点击fiish.
这样我们就可以在Package Explorer找到SerletText项目了,我们在其src中先建立个包com.example.servlet,如何我们开始准备web端的数据。先给大家看下我的项目架构。
首先我们要导入一些json和servlet的jar包。json的jar包网上可以下载的到,servlet的jar包可以先找到Tomcat的安装位置的文件夹,在Tomcat的libs中直接可以找到。
如何我创建的一个User类,代码很简单。
1 package com.example.servlet; 2 3 public class User { 4 5 private String name; 6 private int age; 7 public User(){} 8 public String getName() { 9 return name; 10 } 11 public void setName(String name) { 12 this.name = name; 13 } 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 21 22 }
如何我们再建立个Servlet类,取名ServletDemo。代码如下。
1 package com.example.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import net.sf.json.JSONArray; 15 import net.sf.json.JSONObject; 16 17 18 @WebServlet("/Servletdemo") 19 public class Servletdemo extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 private List<User> list; 22 23 public Servletdemo() { 24 super(); 25 // TODO Auto-generated constructor stub 26 } 27 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 // TODO Auto-generated method stub 30 response.setContentType("text/plain"); 31 response.setCharacterEncoding("UTF-8"); 32 PrintWriter printWriter=response.getWriter();//用PrintWriter在Web端打印数据 33 34 setuser(); 35 JSONArray array=new JSONArray(); 36 for (User object : list) 37 { 38 JSONObject jsonObject=new JSONObject(); 39 try 40 { 41 jsonObject.put("name",object.getName()); 42 jsonObject.put("age", object.getAge()); 43 44 } 45 catch (Exception e) 46 { 47 // TODO: handle exception 48 49 } 50 array.add(jsonObject); 51 52 } 53 printWriter.println(array.toString()); 54 printWriter.flush(); 55 printWriter.close(); 56 } 57 /**往list中添加User对象*/ 58 private void setuser() 59 { 60 list=new ArrayList<User>(); 61 for(int i=0;i<3;i++) 62 { 63 User user=new User(); 64 user.setName("张三"+i); 65 user.setAge(i*10); 66 list.add(user); 67 } 68 69 } 70 71 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 72 // TODO Auto-generated method stub 73 doGet(request, response); 74 } 75 76 }
准备好这些以后,就剩下将ServletDemo部署到服务器上了。鼠标右击ServletDemo(不是ServletText整个项目),run as -- run on server,出现下图,然后next-finish。可以看见内容已经打印在了http://localhost:8080/ServletText/Servletdemo上。至此,服务端已经准备好了。
2.Android接收并解析Json
首先我们建立一个Android项目,取名JsonAnalysis。这里我们先把一些易忘的事情做了。
在AndroidManifest中添加访问网络权限。
<uses permissionandroid:name="android.permission.INTERNET"/>
在lib中导入以下jar包。
完成这些后,我们开始制作布局。布局也相当简单,扔一个Textview进去就行了。
<?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text"/> </LinearLayout>
接下来开始实现功能。我这里封了一个工具类HttpUtils,由于我并没有任何web基础,在这里可费了不少功夫。在这个类中其实还可以设置如网络超时参数等东西,不过我都省略了,只做了些必不可少的工作。另外用了可变长度字符串StringBuilder来返回数据。
1 package com.example.jsonanalysis; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 6 import org.apache.http.HttpEntity; 7 import org.apache.http.HttpResponse; 8 import org.apache.http.client.HttpClient; 9 import org.apache.http.client.methods.HttpGet; 10 import org.apache.http.impl.client.DefaultHttpClient; 11 12 13 public class HttpUtils { 14 15 16 17 public static String getData(String url) throws Exception { 18 19 20 StringBuilder stb = new StringBuilder(); 21 HttpClient httpClient = new DefaultHttpClient(); 22 HttpGet get=new HttpGet(url); 23 HttpResponse httpResponse = httpClient.execute(get); 24 HttpEntity httpEntity = httpResponse.getEntity(); 25 26 if (httpEntity != null) { 27 28 BufferedReader reader = new BufferedReader(new InputStreamReader(httpEntity.getContent())); 29 30 String line = null; 31 32 while ((line = reader.readLine()) != null) { 33 34 stb.append(line); 35 36 } 37 38 return stb.toString(); 39 40 } 41 42 return null; 43 } 44 }
最后是在主activity中有些小细节需注意。
1.访问本地地址的确定。
有很多人说什么访问后台地址不是127.0.0.2,应是10.0.2.2,其实并不都是如此,我并不是很懂这些,一开始两种都试了一下,发现都不行。后来是在cmd中输入ipconfig才找到正确访问地址。所以我这里访问地址为 http://192.168.2.4:8080/ServletText/Servletdemo
2.数据的获取
Android4.0以后就不能再主线程中发起网络请求,可用异步请求或另起一条线程。我这里是在主线程中另起一条线程。
new Thread(new Runnable() { @Override public void run() { //获取数据的代码 } }).start();
下面是主activity的代码。
1 package com.example.jsonanalysis; 2 3 import org.json.JSONArray; 4 import org.json.JSONObject; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.view.Menu; 9 import android.widget.TextView; 10 11 public class MainActivity extends Activity { 12 13 private TextView textview; 14 private static String url="http://192.168.2.4:8080/ServletText/Servletdemo"; 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 textview=(TextView)findViewById(R.id.text); 20 new Thread(new Runnable() { 21 22 @Override 23 public void run() { 24 // TODO Auto-generated method stub 25 try { 26 String str1=HttpUtils.getData(url); 27 StringBuilder str2=new StringBuilder(); 28 JSONArray array=new JSONArray(str1); 29 for(int i=0;i<array.length();i++) 30 { 31 JSONObject obj = array.getJSONObject(i); 32 str2.append("age:").append(obj.getInt("age")).append(" "); 33 str2.append("name:").append(obj.getString("name")).append("\n"); 34 str2.append("----------------------\n" ); 35 } 36 textview.setText(str2.toString()); 37 38 } catch (Exception e) 39 { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 43 } 44 } 45 }).start(); 46 } 47 48 @Override 49 public boolean onCreateOptionsMenu(Menu menu) { 50 // Inflate the menu; this adds items to the action bar if it is present. 51 getMenuInflater().inflate(R.menu.main, menu); 52 return true; 53 } 54 55 }
下面是效果图,大家可以看见已经成功获取数据了。
希望可以帮助到有些正在学习这块,也遇到相同问题的人。