轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/8967080
要做一個優秀的Android應用,使用到網路通訊技術是必不可少的,很難想象一款沒有網路互動的軟體最終能發展得多成功。那麼我們來看一下,一般Android應用程式裡都是怎麼實現網路互動的,這裡拿一個Boook對象為例:
如所示,首先在手機端產生一個Book對象,裡麵包含書名、作者、價格等資料。為了要將這些資料發送到伺服器端,我們要從Book對象中把資料取出,然後組裝成XML格式的字串。接著通過網路API,把組裝好的XML字串發送到伺服器端。伺服器端接到了用戶端發來的XML字串,就要對該XML進行解析。然後把解析出的資料重新組裝成Book對象,之後伺服器端就可以對該對象進行一系列其它的操作了。
當然XML格式的資料量比較大,現在很多Android應用為了節省流量,都改用JSON格式來傳輸資料了。不過不管是使用XML還是JSON,中描述的步驟總是少不了的。
感覺使用這種方式來傳輸資料,每次封裝和解析XML的過程是最繁瑣的,那麼能不能把這最繁瑣的過程繞過去呢?
如所示,如果可以調用網路API,直接把Book對象發送到伺服器端,那麼整個網路互動過程就會變得非常簡單,下面我們就來看看如何?。
建立一個Android工程,命名為ClientTest作為用戶端工程。這裡第一個要確定的就是待傳輸的對象,我們建立一個Book類,代碼如下:
package com.test;import java.io.Serializable;public class Book implements Serializable {private String bookName;private String author;private double price;private int pages;public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getPages() {return pages;}public void setPages(int pages) {this.pages = pages;}}
這個類就是一個簡單的POJO,但是要注意一點,它實現了Serializable介面,如果想在網路上傳輸對象,那麼該對象就一定要實現Serializable介面。
接下來開啟或建立activity_main.xml作為程式的主布局檔案,加入如下代碼:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" tools:context=".MainActivity" > <Button android:id="@+id/send" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="發送" /></RelativeLayout>
這個布局裡面就是包含了一個按鈕,點擊這個按鈕就去發出網路請求。
接下來開啟或建立MainActivity作為程式的主Activity,其中加入如下代碼:
public class MainActivity extends Activity implements OnClickListener {private Button send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);send = (Button) findViewById(R.id.send);send.setOnClickListener(this);}@Overridepublic void onClick(View v) {Book book = new Book();book.setBookName("Android進階編程");book.setAuthor("Reto Meier");book.setPages(398);book.setPrice(59.00);URL url = null;ObjectOutputStream oos = null;try {url = new URL("http://192.168.1.103:8080/ServerTest/servlet/TestServlet");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setDoOutput(true);connection.setConnectTimeout(10000);connection.setReadTimeout(10000);connection.setRequestMethod("POST");oos = new ObjectOutputStream(connection.getOutputStream());oos.writeObject(book);InputStreamReader read = new InputStreamReader(connection.getInputStream());BufferedReader br = new BufferedReader(read);String line = "";while ((line = br.readLine()) != null) {Log.d("TAG", "line is " + line);}br.close();connection.disconnect();} catch (Exception e) {e.printStackTrace();} finally {}}}
我們可以看到,在onClick方法中處理了按扭的點擊事件。這裡首先new出了一個Book對象作為待傳輸資料,接著new出了一個URL對象,指明了伺服器端的介面地址,然後對HttpURLConnection的一些選擇性參數進行配置。接著通過調用ObjectOutputStream的writeObject方法,將Book對象發送到伺服器端,然後等伺服器端返回資料,最後關閉流和串連。
注意由於我們使用了網路功能,因此需要在AndroidManifest.xml中加入如下許可權:
<uses-permission android:name="android.permission.INTERNET" />
好了,目前Android端的代碼已經開發完成,我們現在開始來編寫伺服器端代碼。
建立一個名為ServerTest的Web Project,要做的第一件事就在Web Project下建立一個和Android端一樣的Book類。這裡有個非常重要的點大家一定要注意,伺服器端的Book類和Android端的Book類,包名和類名都必須相同,否則會出現類型轉換異常。這裡由於兩個Book類的內容是完全一樣的,我就不再重複貼出。
然後建立一個Java Servlet作為網路提供者,我們重寫它的doPost方法,具體代碼如下:
public class TestServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ObjectInputStream ois = null;try {ois = new ObjectInputStream(request.getInputStream());Book book = (Book) ois.readObject();System.out.println("書名是: " + book.getBookName());System.out.println("作者是: " + book.getAuthor());System.out.println("價格是: " + book.getPrice());System.out.println("頁數是: " + book.getPages());PrintWriter out = response.getWriter();out.print("success");out.flush();out.close();} catch (Exception e) {e.printStackTrace();} finally {ois.close();}}}
可以看到,我們首先通過調用HttpServletRequest的getInputStream方法擷取到輸入資料流,然後將這個輸入資料流組裝成ObjectInputStream對象。接下來就很簡單了,直接調用ObjectInputStream的readObject方法,將網路上傳輸過來的Book對象擷取到,然後列印出Book中攜帶的資料,最後向用戶端返回success。
現在我們來運行一下程式,首先將ServerTest這個項目布置到伺服器上,並開啟伺服器待命。接著在手機上開啟ClientTest這個應用程式,如所示:
點擊發送發出網路請求,可以看到伺服器端列印結果如下:
而Android端列印結果如下:
由此我們可以看出,網路上進行對象傳輸已經成功了!不需要通過繁瑣的XML封裝和解析,我們也成功將Book中的資料完整地從Android端發送到了伺服器端。
好了,今天的講解到此結束,有疑問的朋友請在下面留言。
源碼下載,請點擊這裡