編輯:關於Android編程
在完成了用戶注冊和登錄頁面的界面設計工作之後,我們就需要讓我們的程序向後台發起請求,請求後台PHP程序實際進行用戶注冊操作。在新版本的Android系統中,所有的網絡請求必須以異步的方式來進行,我們既可以通過線程方式也可以通過Android系統為我們提供的異步任務方式來完成,我們在這裡選擇采用異步任務的方式來進行網絡操作。
根據異步任務的原理,當應用調用異步任務時,異步任務會在後台完成相應的網絡操作,在完成之後,在onPostExecute方法中通知界面,更新操作狀態。有兩種方法可以完成這項任務,一種是將Activity對象放到異步任務類中,當需要更新界面時,直接調用該Activity對象的方法即可,另一種方式是傳入Activity對象的Handler對象,當異步任務完成網絡操作時,向Handler對象發送消息,由Handler對象來更新界面。從上面的分析可以看出,第一種方法使Activity和異步任務之間產生了緊耦合,是軟件開發中不太提倡的,因此我們采用第二種方式,即采用Handler對象,異步任務通過發送消息通知Activity更新界面狀態。我們首先在JysRegisterLoginActivity類中,定義與異步任務交互的Handler:
static protected class JysRegisterLoginHandler extends WkyRegisterLoginHandler {
public JysRegisterLoginHandler(JysRegisterLoginActivity activity) {
this.activity = activity;
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 自己額外的處理
switch (msg.what) {
case WkyConstants.MSG_REGISTER_USER:
activity.processRegisterUserResult(msg);
break;
}
}
private JysRegisterLoginActivity activity = null;
}
需要注意的是,我們將JysRegisterLoginHandler聲明為靜態的內部類,因為如果只聲明為內部類,有出現內存洩露的可能性。
handler = new JysRegisterLoginHandler(this);
/**
* 點擊注冊/登錄按鈕
* 【闫濤 2015.09.16】初始版本
*/
protected void setRegisterOrLoginImgvOnClickListener() {
registerOrLoginImgv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("wky", "register or login to the system...");
if (wkyRegisterLoginModel.getState() == WkyRegisterLoginModel.STATE_REGISTER) {
registerUser();
} else if (wkyRegisterLoginModel.getState() == WkyRegisterLoginModel.STATE_LOGIN) {
Log.e("wky", "login the user");
}
}
});
}
protected void registerUser() {
Log.e("wky", "Regisger the user");
if (null == registerTask) {
registerTask = new WkyRegisterAsyncTask(this, handler);
String urlStr = WkyConstants.CMD_REGISTER_USER;
Log.e("wky", "url=" + urlStr + "!");
String body = prepareRegisterReqBody();
registerTask.execute(urlStr, body);
}
}
異步任務需要兩個參數,一個是請求URL,另一個是Json格式的請求數據。
/**
* 異步任務開始前的回調函數
* 【闫濤 2015.09.24】初始版本
*/
@Override
protected void onPreExecute() {
Log.e("wky", "WkyRegisterAsyncTask.onPreExecute 1");
}
/**
* 具體異步任務執行函數
* 【闫濤 2015.09.24】初始版本
*/
@Override
protected String doInBackground(String... params) {
String urlStr = params[0];
String body = params[1];
return WkyHttpClient.doPost(urlStr, body);
}
/**
* 更新異步任務狀態信息(在顯示進度條時會用到)
* 【闫濤 2015.09.24】初始版本
*/
@Override
protected void onProgressUpdate(Integer... progress) {
}
/**
* 異步任務結束時要調用的方法,通知頁面進行更新
* 【闫濤 2015.09.24】初始版本
*/
@Override
protected void onPostExecute(String result) {
Log.e("wky", "new:" + result);
Message msg = handler.obtainMessage();
msg.what = WkyConstants.MSG_REGISTER_USER;
Bundle params = new Bundle();
params.putString(WkyConstants.MSG_DATA_NAME, result);
msg.setData(params);
handler.dispatchMessage(msg);
}
從上面的代碼中可以看出,在doInBackground中調用網絡POST請求方法,發送POST請求。這裡重點是在onPostExecute方法中,生成一個Message對象,將POST響應字符串,添加到Message對象中,然後向Handler對象發送消息。在前面Handler類的代碼中,接收到這個消息,就會調用相相應的方法來處理響應結果了。代碼如下所示:
public void processRegisterUserResult(Message msg) {
String jsonStr = msg.getData().getString(WkyConstants.MSG_DATA_NAME);
JSONObject json = null;
String status = null;
long userId = 0;
try {
json = new JSONObject(jsonStr);
status = json.getString("status");
userId = json.getLong("userId");
Log.e("wky", "^_^ registerUser:" + status + "; u=" + userId + "!");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在這裡我們什麼也沒做,只是把響應結果變為json對象,從中取出status和userId等項目,在實際的代碼中,我們需要記錄下用戶的信息,然後轉到應用首頁中去。
/**
* 普通POST請求,窗體形式,沒有文件上傳操作
* @param urlStr
* @param data 以JSON格式存在
* @return 響應字符串
* 【闫濤 2015.09.23】初始版本
*/
public static String doPost(String urlStr, String data) {
HttpURLConnection conn = null;
OutputStreamWriter outStream = null;
StringBuilder result = new StringBuilder();
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("charset", "utf-8");
conn.setRequestMethod(POST);
conn.setRequestProperty("Content-type",
"application/x-www-form-urlencoded");
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
conn.connect();
outStream = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
if (data != null) {
outStream.write(data);
}
outStream.flush();
outStream.close();
// }
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
result.append(readAsString(conn.getInputStream(), "UTF-8"));
}else{
Log.e("wky","ResponseCode:" + conn.getResponseCode());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
華麗的分隔線
******************************************************************************************************************************************************************************
希望大家多支持,有大家的支持,我才能走得更遠,謝謝!
銀行賬號:622202 0200 1078 56128 闫濤
我的支付寶:yt7589@hotmail.com
Android之網絡通信Volley框架用法
概述:Volley提供的功能簡單的講,提供了如下主要的功能:1、封裝了的異步的RESTful 請求API;2、一個優雅和穩健的請求隊列;3、一個可擴展的架構,它使開發人員
為什麼手機root失敗?刷機精靈root失敗怎麼辦?
ROOT幾乎成了安卓手機發燒友不可不做的一道程序。常在河邊走,哪能不濕鞋。即使是老手,也能碰到root失敗的情況。那為什麼手機root失敗?刷機精靈root
android產品研發(十五)--)內存對象序列化
上一篇文章中我們講解了android app中的升級更新操作,app的升級更新操作算是App的標配了,升級操作就是獲取App的升級信息,更新操作是下載,安裝,更新app,
Android特效之水波紋的實現
前言水波紋特效,想必大家或多或少見過,在我的印象中,大致有如下幾種: 支付寶 咻咻咻 式