編輯:關於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("----------------------發送請求到服務器----------------------");
// 訪問網絡 (需要一個網絡的權限)
// 訪問網絡(耗時的操作) 避免阻塞主線程(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); } });
以上代碼僅供參考學習,如有問題請留言
准備階段 將WebInfos文件夾放在手機存儲卡的根目錄下,用Eclipse導入項目WebSerser,運行到手機中。 將WebInfos文件夾放在手機存
今天要實現的效果如下:1.彈幕垂直方向固定2.彈幕垂直方向隨機上面效果圖中白色的背景就是彈幕本身,是一個自定義的FrameLayout,我這裡是為了更好的展示彈幕的位置才
原圖 點擊後 代碼@Override public void onClick(View view) { switch (view.getId())
Gallery與Spinner有共同父類:AbsPinner,說明Gallery與Spinner都是一個列表框。它們之間的區別在於Spinner顯示的是一個垂直的列表選擇