Android之使用json進行網路資料交換

來源:互聯網
上載者:User

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 stub26 }27 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {29 // TODO Auto-generated method stub30 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 exception48 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 stub73 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 @Override16 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 @Override23 public void run() {24 // TODO Auto-generated method stub25 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 block41 e.printStackTrace();42 43 } 44 }45 }).start(); 46 }47 48 @Override49 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

 下面是,大家可以看見已經成功擷取資料了。

希望可以協助到有些正在學習這塊,也遇到相同問題的人。

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.