編輯:關於Android編程
一般情況下,客戶端和服務端的數據交互都是使用json和XML,相比於XML,json更加輕量級,並且省流量,但是,無論我們用json還是用xml,都需要我們先將數據封裝成json字符串或者是一個xml字符串然後傳輸,那麼有沒有可能我們直接在android客戶端上傳遞一個Object給服務器端呢?答案是肯定的。
我們看一個簡單的App注冊頁面,如下圖:
當我們點擊注冊按鈕的時候,將用戶的注冊信息通過一個Object對象傳遞到服務器,好,下來我們看看怎麼樣來傳遞對象:
首先我們要把用戶的注冊信息封裝成一個JavaBean,為了這個JavaBean可以在網絡上傳輸,我們要實現Serializable接口:
public class Person implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String password; private String username; private String nickname; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public Person(String password, String username, String nickname) { super(); this.password = password; this.username = username; this.nickname = nickname; } public Person() { } }
TransObject to = new TransObject(); to.execute(new Person(passwd.getText().toString(), name.getText() .toString(), nickname.getText().toString()));
class TransObject extends AsyncTask我們在doInBackground中執行我們的網絡請求,通過一個對象輸出流將我們的對象輸出到服務端,然後將請求結果返回給onPostExecute方法,在onPostExecute中判斷是否注冊成功。這是客戶端的寫法,我們再看看服務端的寫法:{ @Override protected String doInBackground(Person... params) { StringBuffer sb = new StringBuffer(); Person p = params[0]; BufferedReader reader = null; HttpURLConnection con = null; ObjectOutputStream oos = null; try { URL url = new URL(http://192.168.1.106/android/to); con = (HttpURLConnection) url.openConnection(); // 設置允許輸出,默認為false con.setDoOutput(true); con.setConnectTimeout(5 * 1000); con.setReadTimeout(10 * 1000); // 請求方式為POST請求 con.setRequestMethod(POST); oos = new ObjectOutputStream(con.getOutputStream()); // 向服務端寫數據 oos.writeObject(p); // 獲得服務端的返回數據 InputStreamReader read = new InputStreamReader( con.getInputStream()); reader = new BufferedReader(read); String line = ; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (oos != null) { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } if (con != null) { con.disconnect(); } } return sb.toString(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null && OK.equals(result)) { Toast.makeText(MainActivity.this, 注冊成功, Toast.LENGTH_SHORT) .show(); } } }
@WebServlet(/to) public class TransObject extends HttpServlet { private static final long serialVersionUID = 1L; public TransObject() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(doGet); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(doPost); ObjectInputStream ois = new ObjectInputStream(request.getInputStream()); try { Person p = (Person) ois.readObject(); System.out.println(密碼是: + p.getPassword()); System.out.println(用戶名是: + p.getUsername()); System.out.println(昵稱是: + p.getNickname()); PrintWriter out = response.getWriter(); out.print(OK); out.flush(); out.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (ois != null) { ois.close(); } } } }
好了,經過上面幾個步驟我們就可以給將android客戶端的一個Object傳遞到服務器上了,就這麼簡單,省去了將對象轉為json或者XML的麻煩。
今天有點累,我就直接把代碼粘上了,不過我在裡面加了注釋,方便大家理解。Activity:public class IntentActivity extends AppCo
0. 前言今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什麼要講二維碼,因為二維碼太普遍了,隨便一個Android APP都會有二維碼掃描。本篇旨在
我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 後,看到 Flipboard 的 Android 項目也在使用 RxJava ,並且使用
前言Snackbar 是一種針對操作的輕量級反饋機制,常以一個小的彈出框的形式,出現在手機屏幕下方或者桌面左下方。它們出現在屏幕所有層的最上方,包括浮動操作按鈕。Snac