• 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类,代码很简单。

    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。代码如下。

    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 }
    HttpUtils

     最后是在主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 }
    main-activity

     下面是效果图,大家可以看见已经成功获取数据了。

    希望可以帮助到有些正在学习这块,也遇到相同问题的人。

  • 相关阅读:
    「Poetize7」Freda的访客
    「Poetize8」Divisible
    「Poetize5」Vani和Cl2捉迷藏
    1082. 员工的重要度
    1080. 最大的岛
    1079. 连续子串计数(经典)
    1078. 数组的度
    1071. 词典中最长的单词
    1068. 寻找数组的中心索引
    1062. 洪水填充(经典)
  • 原文地址:https://www.cnblogs.com/zhrxidian/p/3815116.html
Copyright © 2020-2023  润新知