1. 程式人生 > >06_android入門_採用HttpURLConnection的POST方式實現登陸案例

06_android入門_採用HttpURLConnection的POST方式實現登陸案例

3.具體的Activity的實現程式碼如下:

package www.csdn.net.lesson03;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LoginActivity extends Activity {
	// 宣告控制元件物件
	private EditText et_name, et_pass;
	// 宣告顯示返回資料庫的控制元件物件
	private TextView tv_result;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 設定顯示的檢視
		setContentView(R.layout.activity_login);
		// 通過 findViewById(id)方法獲取使用者名稱的控制元件物件
		et_name = (EditText) findViewById(R.id.et_name);
		// 通過 findViewById(id)方法獲取使用者密碼的控制元件物件
		et_pass = (EditText) findViewById(R.id.et_pass);

		// 通過 findViewById(id)方法獲取顯示返回資料的控制元件物件
		tv_result = (TextView) findViewById(R.id.tv_result);

	}

	/**
	 * 通過android:onClick="login"指定的方法 , 要求這個方法中接受你點選控制元件物件的引數v
	 * 
	 * @param v
	 */
	public void login(View v) {
		// 獲取點選控制元件的id
		int id = v.getId();
		// 根據id進行判斷進行怎麼樣的處理
		switch (id) {
		// 登陸事件的處理
		case R.id.btn_login:
			// 獲取使用者名稱
			final String userName = et_name.getText().toString();
			// 獲取使用者密碼
			final String userPass = et_pass.getText().toString();
			if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
				Toast.makeText(this, "使用者名稱或者密碼不能為空", Toast.LENGTH_LONG).show();
			} else {
				// 開啟子執行緒
				new Thread() {
					public void run() {
						loginByPost(userName, userPass); // 呼叫loginByPost方法
					};
				}.start();
			}
			break;
		}

	}

	/**
	 * POST請求操作
	 * 
	 * @param userName
	 * @param userPass
	 */
	public void loginByPost(String userName, String userPass) {

		try {

			// 請求的地址
			String spec = "http://172.16.237.200:8080/video/login.do";
			// 根據地址建立URL物件
			URL url = new URL(spec);
			// 根據URL物件開啟連結
			HttpURLConnection urlConnection = (HttpURLConnection) url
					.openConnection();
			// 設定請求的方式
			urlConnection.setRequestMethod("POST");
			// 設定請求的超時時間
			urlConnection.setReadTimeout(5000);
			urlConnection.setConnectTimeout(5000);
			// 傳遞的資料
			String data = "username=" + URLEncoder.encode(userName, "UTF-8")
					+ "&userpass=" + URLEncoder.encode(userPass, "UTF-8");
			// 設定請求的頭
			urlConnection.setRequestProperty("Connection", "keep-alive");
			// 設定請求的頭
			urlConnection.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			// 設定請求的頭
			urlConnection.setRequestProperty("Content-Length",
					String.valueOf(data.getBytes().length));
			// 設定請求的頭
			urlConnection
					.setRequestProperty("User-Agent",
							"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");

			urlConnection.setDoOutput(true); // 傳送POST請求必須設定允許輸出
			urlConnection.setDoInput(true); // 傳送POST請求必須設定允許輸入
											//setDoInput的預設值就是true
			//獲取輸出流
			OutputStream os = urlConnection.getOutputStream();
			os.write(data.getBytes());
			os.flush();
			if (urlConnection.getResponseCode() == 200) {
				// 獲取響應的輸入流物件
				InputStream is = urlConnection.getInputStream();
				// 建立位元組輸出流物件
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				// 定義讀取的長度
				int len = 0;
				// 定義緩衝區
				byte buffer[] = new byte[1024];
				// 按照緩衝區的大小,迴圈讀取
				while ((len = is.read(buffer)) != -1) {
					// 根據讀取的長度寫入到os物件中
					baos.write(buffer, 0, len);
				}
				// 釋放資源
				is.close();
				baos.close();
				// 返回字串
				final String result = new String(baos.toByteArray());

				// 通過runOnUiThread方法進行修改主執行緒的控制元件內容
				LoginActivity.this.runOnUiThread(new Runnable() {
					@Override
					public void run() {
						// 在這裡把返回的資料寫在控制元件上 會出現什麼情況尼
						tv_result.setText(result);
					}
				});

			} else {
				System.out.println("連結失敗.........");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

實現的效果圖如下: