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

來源:互聯網
上載者:User

標籤:android   style   class   blog   c   code   

當點擊登陸之後,怎麼把伺服器端返回的資料,寫到指定的控制項上尼?,在android怎麼實現尼?下面我們通過具體的代碼進行分析和實現,希望能對你,在學習android知識上有所協助。

下面通過代碼說明:

package www.csdn.net.lesson03;


import java.io.ByteArrayOutputStream;
import java.io.InputStream;
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 {
System.out
.println("----------------------發送請求到伺服器----------------------");
// 訪問網路 (需要一個網路的許可權) <uses-permission
// 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控制項內容@Overridepublic void run() {// 在這裡把返回的資料寫在控制項上 會出現什麼情況尼tv_result.setText(result);}});

測試效果如下:

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.