当点击登陆之后,怎么把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控件内容@Overridepublic void run() {// 在这里把返回的数据写在控件上 会出现什么情况尼tv_result.setText(result);}});

測试效果例如以下:

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

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

  1. FLASH 上传控件传输,服务端保存文件

    /// <summary>/// FLASH 上传控件传输,服务端保存文件/// </summary>public static uint fileUpload(HttpReq ...

  2. oc中在控件上显示图片

    当我们想在控件上改变图片的时候,我们需要做的是获得图片的引用,然后调用函数,来设置图片.那么具体是怎样来操作. 第一步是获得控件的引用: @property(weak,nonatomic)IBOutl ...

  3. mfc调取摄像头显示并截图_用OpenCV在MFC Dialog中Picture控件上显示摄像头采集实时视频...

    OpenCV之所以能在MFC Dialog的Picture控件上绘图,全靠了CvvImage::DrawToHDC()方法.这就是下文为出现CvvImage和HDC的原因.下面是具体过程,用OpenC ...

  4. 以编程的方式向窗体添加控件以及对内容高亮显示

    using System; using System.Drawing; using System.Windows.Forms;namespace HighLIght {public partial c ...

  5. VS2010/MFC编程入门之二十(常用控件:静态文本框)

    上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...

  6. QT-在子控件上绘图的两种方式

    Qt 在控件上面绘图 label,pushbutton..... 1.构建一个新类来调用该控件的绘图函数,新类重写 paintEvent(QPaintEvent *) ▶构建: class DrawG ...

  7. Qt-在控件上绘图的方式

    1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上 ...

  8. MFC编程入门之二十(常用控件:静态文本框)

    上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...

  9. android 代码控件框高,Android控件_TextView(显示文本框控件)

    一.TextView控件的常用属性 1.android:id--控件的id 2.android:layout_width--设置控件的宽度 wrap_content(包裹实际文本内容) fill_pa ...

最新文章

  1. 深度学习核心技术精讲100篇(七十五)-集成学习
  2. tomcat 容器生命周期lifecycle
  3. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
  4. P3243 [HNOI2015]菜肴制作(拓扑排序、贪心)
  5. flex 学习篇 ---- 导航类容器
  6. 【TDS学习文档5】IBM Directory schema的管理3——attributes
  7. Flash制作空战游戏
  8. dvwa-sql盲注
  9. 人工智能语音如何实现?
  10. CH552-HID 键盘 鼠标
  11. 新增轮播图跳转web页面、轮播、推荐歌单数据存储( 简易音乐 七)
  12. pdf压缩文件怎么压缩最小,pdf大小超过上传大小不能上传怎么压缩?
  13. Mac 更新系统后无法正常启动
  14. java怎么实现华为云文字识别,华为云语音识别:一句话识别API调用
  15. JS创建对象模式7种方法详解
  16. 蜗牛移动被联通叫停放号,疑为受到大量投诉
  17. Beosin EOS-IDE 升级用户体验及常见问题答疑
  18. 华附计算机学神,【学习】时隔13年,华附两牛娃杀进奥数国家队,父母亲述学霸成长史!...
  19. python刷题一亩三分地_一亩三分地
  20. 怎样给Tab Control控件加上背景颜色或图片

热门文章

  1. 几个大厂及 RCE漏洞二三事
  2. 点击复制,兼容ios-safari
  3. 基于Java Bean Validation对Request参数进行校验的设计思路
  4. 万亿安防市场前景可期 未来四大发展趋势分析
  5. 俄罗斯:国家机构今年已遭1000多万起网络攻击
  6. 程序员的量化交易之路(17)--Cointrader之Temporal实体(5)
  7. python获取Linux信息
  8. CListCtrl使用方法
  9. discuz点歌台插件
  10. java servlet 学习_java学习之web基础(1):Servlet