当点击登陆之后,怎么把server端返回的数据,写到指定的控件上尼?,在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)方法获取username的控件对象

et_name = (EditText) findViewById(R.id.et_name);

// 通过 findViewById(id)方法获取用户password的控件对象

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:

// 获取username

final String userName = et_name.getText().toString();

// 获取用户password

final String userPass = et_pass.getText().toString();

if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {

Toast.makeText(this, "username或者password不能为空", Toast.LENGTH_LONG).show();

} else {

System.out

.println("----------------------发送请求到server----------------------");

// 訪问网络 (须要一个网络的权限) <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控件内容
@Override
public void run() {
// 在这里把返回的数据写在控件上 会出现什么情况尼
tv_result.setText(result);
}
});

測试效果例如以下:

以上代码仅供參考学习,如有问题请留言

05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)的更多相关文章

  1. 对话框上动态控件的创建、在Picture Control控件上显示图片

    1  MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...

  2. atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践

    atitit.Atitit.  Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ...

  3. Qt中,将以png为格式的图片在按钮控件上显示

    在Qt编程中,我们常常会遇见这样或那样的小问题,这里,我介绍一个将png为格式的图片在按钮控件上显示的小功能. resistanceBtn = new QPushButton(element); re ...

  4. WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用

    例如:<asp:TextBox id="TextBox1" runat="server"></asp:TextBox> <INPU ...

  5. js 日期控件 可以显示为和历

    日期控件的js <!-- /** * Calendar * @param beginYear 1990 * @param endYear 2010 * @param language 0(zh_ ...

  6. Android入门(六):Android控件布局属性全解

    第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中 (Hrizontal表示水平)android:layout_centerVertical 垂 ...

  7. 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)

    在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...

  8. WPF自学入门(二)WPF-XAML布局控件

    上一篇介绍了xaml基本知识,我们已经知道了WPF简单的语法.那么接下来,我们要认识一下WPF的布局容器.布局容器可以使控件按照分类显示,我们一起来看看WPF里面可以使用哪些布局容器用来布局. 在WP ...

  9. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

随机推荐

  1. object does not contain a definition for get_range

      原因[1] 在VS2012中调用COM Interop DLL操作Excel通过get_Range去获取Range时,会发生Object does not contain a definition ...

  2. mybatis注解详解

    首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则jar会根据你的pom配 ...

  3. 组合 z

    输入a b c d e以及它们对应的数字 比如 a-->1 2 3  b-->2 3 c-->1 d-->3 4 5 e-->1 3 5 输出a b c d e的可用组合 ...

  4. ansible定时任务模块和用户组模块使用

    接上篇,还是一些基础模块的使用,这里主要介绍的是系统模块的使用. 下面例子都进行过相关的实践,从而可以直接进行使用相关的命令. 3.用户模块的使用 用户模块主要用来管理用户账号和用户的属性(对远程主机 ...

  5. linux常用的一些命令(不断增加中)

    linux 下重启 apache: httpd -k restart 下面这些大多命令都可以在<鸟哥私房菜>的服务器中的“常用网络指令”和基础中的“程序与资源管理”中找到ps -aux 这 ...

  6. Hadoop2.2 federnation联盟的搭建

    联盟实际上是一个单独的集群,集群里面包含很多的NameService共享同样的DataNode,同一份数据只上传一份,block块相同,一个集群中删除,另一个集群中还是存在的.同一份数据只是在name ...

  7. poj 1581 A Contesting Decision

    题目大意:有四个题目,有某些队做题,写一个判断程序如:Stars 2 20 5 0 4 190 3 220Stars是队名,2是提交的次数,20是花费的时间,花费时间为0则说明题目提交错误,错误的忽略 ...

  8. pku3664 Election Time

    http://poj.org/problem?id=3664 水题 #include <stdio.h> #include <map> using namespace std; ...

  9. 在IT网站上少花些时间

    我自己关注的IT网站还是蛮多的,经常去的有CSDN,博客园,51CTO,InfoQ,还有微博,微信上关注了IT程序猿,IT技术博客大学习,程序员之家, 开发者头条,还有还有,我还通过邮件订阅了码家周刊 ...

  10. 【原】Hadoop伪分布模式的安装

    Hadoop伪分布模式的安装 [环境参数] (1)Host OS:Win7 64bit (2)IDE:Eclipse Version: Luna Service Release 2 (4.4.2) ( ...