Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 05_android入門_GET方式實現登陸(在控件上顯示服務端返回的內容)

05_android入門_GET方式實現登陸(在控件上顯示服務端返回的內容)

編輯:關於Android編程

\\

當點擊登陸之後,怎麼把服務器端返回的數據,寫到指定的控件上尼?,在android怎麼實現尼?下面我們通過具體的代碼進行分析和實現,希望能對你,在學習android知識上有所幫助。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z8LD5s2ouf20+sLry7XD96O6PC9wPgo8cD5wYWNrYWdlIHd3dy5jc2RuLm5ldC5sZXNzb24wMzs8YnI+Cjxicj4KPGJyPgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07PGJyPgppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTs8YnI+CmltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjs8YnI+CmltcG9ydCBqYXZhLm5ldC5VUkw7PGJyPgppbXBvcnQgamF2YS5uZXQuVVJMRW5jb2Rlcjs8YnI+Cjxicj4KPGJyPgppbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7PGJyPgppbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7PGJyPgppbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczs8YnI+CmltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzs8YnI+CmltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDs8YnI+CmltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldzs8YnI+CmltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDs8YnI+Cjxicj4KPGJyPgpwdWJsaWMgY2xhc3MgTG9naW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHs8YnI+Ci8vIMn5w/e/2Lz+ttTP8zxicj4KcHJpdmF0ZSBFZGl0VGV4dCBldF9uYW1lLCBldF9wYXNzOzxicj4KLy8gyfnD98/Uyr63tbvYyv2+3b/itcS/2Lz+ttTP8zxicj4KcHJpdmF0ZSBUZXh0VmlldyB0dl9yZXN1bHQ7PC9wPgo8cD48YnI+CkBPdmVycmlkZTxicj4KcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgezxicj4Kc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTs8YnI+Ci8vIMno1sPP1Mq+tcTK0828PGJyPgpzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9sb2dpbik7PGJyPgovLyDNqLn9IGZpbmRWaWV3QnlJZChpZCm3vbeou/HIodPDu6fD+7XEv9i8/rbUz/M8YnI+CmV0X25hbWUgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmV0X25hbWUpOzxicj4KLy8gzai5/SBmaW5kVmlld0J5SWQoaWQpt723qLvxyKHTw7unw9zC67XEv9i8/rbUz/M8YnI+CmV0X3Bhc3MgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmV0X3Bhc3MpOzxicj4KPGJyPgo8YnI+Ci8vIM2ouf0gZmluZFZpZXdCeUlkKGlkKbe9t6i78cihz9TKvre1u9jK/b7dtcS/2Lz+ttTP8zxicj4KdHZfcmVzdWx0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50dl9yZXN1bHQpOzxicj4KPGJyPgo8YnI+Cn08YnI+Cjxicj4KPGJyPgovKio8YnI+Ciogzai5/WFuZHJvaWQ6b25DbGljaz0="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 {
System.out
.println("----------------------發送請求到服務器----------------------");
// 訪問網絡 (需要一個網絡的權限) // android:name="android.permission.INTERNET"/>
// 訪問網絡(耗時的操作) 避免阻塞主線程(UI) 需要開啟新的子線程來處理
new Thread() {
public void run() {
// 調用loginByGet方法
loginByGet(userName, userPass);
};
}.start();
}
break;
default:
break;
}

}


/**
* 通過GET方式發送的請求
*
* @param userName
* @param userPass
*/
public void loginByGet(String userName, String userPass) {


try {
// 設置請求的地址 通過URLEncoder.encode(String s, String enc)
// 使用指定的編碼機制將字符串轉換為 application/x-www-form-urlencoded 格式
String spec = "http://172.16.237.200:8080/video/login.do?username="
+ URLEncoder.encode(userName, "UTF-8") + "&userpass="
+ URLEncoder.encode(userPass, "UTF-8");
// 根據地址創建URL對象(網絡訪問的url)
URL url = new URL(spec);
// url.openConnection()打開網絡鏈接
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setRequestMethod("GET");// 設置請求的方式
urlConnection.setReadTimeout(5000);// 設置超時的時間
urlConnection.setConnectTimeout(5000);// 設置鏈接超時的時間
// 設置請求的頭
urlConnection
.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
// 獲取響應的狀態碼 404 200 505 302
if (urlConnection.getResponseCode() == 200) {
// 獲取響應的輸入流對象
InputStream is = urlConnection.getInputStream();


// 創建字節輸出流對象
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 定義讀取的長度
int len = 0;
// 定義緩沖區
byte buffer[] = new byte[1024];
// 按照緩沖區的大小,循環讀取
while ((len = is.read(buffer)) != -1) {
// 根據讀取的長度寫入到os對象中
os.write(buffer, 0, len);
}
// 釋放資源
is.close();
os.close();
// 返回字符串
String result = new String(os.toByteArray());
System.out.println("***************" + result+ "******************");

// 在這裡把返回的數據寫在控件上 會出現什麼情況尼
tv_result.setText(result);
} else {
System.out.println("------------------鏈接失敗-----------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

通過添加紅色的代碼進行實現,會發現出現如下bug:

05-24 06:38:37.987: W/System.err(1170): android.view.ViewRootImpl$CalledFromWrongThreadException:
 Only the original thread that created a view hierarchy can touch its views.
05-24 06:38:37.997: W/System.err(1170): 	
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
05-24 06:38:37.997: W/System.err(1170): 	
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:824)
05-24 06:38:38.007: W/System.err(1170): 	
at android.view.View.requestLayout(View.java:16431)
05-24 06:38:38.007: W/System.err(1170): 	
at android.view.View.requestLayout(View.java:16431)
05-24 06:38:38.007: W/System.err(1170): 	
at android.view.View.requestLayout(View.java:16431)
05-24 06:38:38.007: W/System.err(1170): 	
at android.view.View.requestLayout(View.java:16431)
05-24 06:38:38.007: W/System.err(1170): 	
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
05-24 06:38:38.007: W/System.err(1170): 
at android.view.View.requestLayout(View.java:16431)
05-24 06:38:38.007: W/System.err(1170): 	
at android.widget.TextView.checkForRelayout(TextView.java:6600)
05-24 06:38:38.007: W/System.err(1170): 	
at android.widget.TextView.setText(TextView.java:3813)
05-24 06:38:38.007: W/System.err(1170): 	
at android.widget.TextView.setText(TextView.java:3671)
05-24 06:38:38.017: W/System.err(1170): 	
at android.widget.TextView.setText(TextView.java:3646)
05-24 06:38:38.017: W/System.err(1170): 	
at www.csdn.net.lesson03.LoginActivity.loginByGet(LoginActivity.java:134)
05-24 06:38:38.027: W/System.err(1170): 	
at www.csdn.net.lesson03.LoginActivity$1.run(LoginActivity.java:67)

錯誤的原因是:

只有原來的線程創建的視圖層次可以觸摸它的控件. 所以只有在主線程中,才能夠設置返回數據控件的內容。

那麼怎麼實現效果,我們可以使用Activity中給我們提供的runOnUiThread(action);的方法實現,把我們要進行設置返回數據控件的內容放在此方法中即可。具體的部分代碼如下:

// 返回字符串
				final String result = new String(os.toByteArray());
				System.out.println("***************" + result
						+ "******************");

				LoginActivity.this.runOnUiThread(new Runnable() { //才用此方法進行修改主線程中的UI控件內容
					@Override
					public void run() {
						// 在這裡把返回的數據寫在控件上 會出現什麼情況尼
						tv_result.setText(result);
					}
				});
				

測試效果如下:

以上代碼僅供參考學習,如有問題請留言

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved