05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)
当点击登陆之后,怎么把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方式实现登陆(在控件上显示服务端返回的内容)的更多相关文章
- 对话框上动态控件的创建、在Picture Control控件上显示图片
1 MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...
- atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践
atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ...
- Qt中,将以png为格式的图片在按钮控件上显示
在Qt编程中,我们常常会遇见这样或那样的小问题,这里,我介绍一个将png为格式的图片在按钮控件上显示的小功能. resistanceBtn = new QPushButton(element); re ...
- WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用
例如:<asp:TextBox id="TextBox1" runat="server"></asp:TextBox> <INPU ...
- js 日期控件 可以显示为和历
日期控件的js <!-- /** * Calendar * @param beginYear 1990 * @param endYear 2010 * @param language 0(zh_ ...
- Android入门(六):Android控件布局属性全解
第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中 (Hrizontal表示水平)android:layout_centerVertical 垂 ...
- 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)
在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...
- WPF自学入门(二)WPF-XAML布局控件
上一篇介绍了xaml基本知识,我们已经知道了WPF简单的语法.那么接下来,我们要认识一下WPF的布局容器.布局容器可以使控件按照分类显示,我们一起来看看WPF里面可以使用哪些布局容器用来布局. 在WP ...
- [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法
如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...
随机推荐
- Http相应代码及获取方法
1xx(临时响应)用于表示临时响应并需要请求者执行操作才能继续的状态代码. 代码 说明 100(继续) 请求者应当继续提出请求.服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其 ...
- Raspberry Pi3 ~ 配置网络
Rpi3 有两个网卡 一个无线wlan 一个有线 eth0 无线的只需要在右上角的那个配置里面添加就行 有线的需要设置下静态IP.dns.等 在raspbain图形化界面里面 设置 Network P ...
- 查找指定目录下的文件 .xml
pre{ line-height:1; color:#9f1d66; background-color:#cfe4e4; font-size:16px;}.sysFunc{color:#5d57ff; ...
- Delphi下使用OpenOffice+JodConverter+SWFtools进行文件转换
目的:office文件转换为PDF或SWF,最终可使用Flexpaper调用adobe flash player进行浏览 放弃两个文件转换工具: 1.FlashPaper,转换出的文件由于自带工具栏, ...
- WPF 简介
简介 一. WPF产生的背景 因为人们的生活水平不断提前,审美观也随着提升,而软件的应用发展水平目前无法赶上大家的审美观和使用要求:比如:像电影中的软件能够方便的使用,而且有动态的效果同时附加形象 ...
- 生成500个0-1000的随机数&&数组查找—小练习
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 第三百三十三天 how can I 坚持
为什么感觉那么累呢,老想睡觉. 晚上勇江请吃饭,其实内心是拒绝的,好伐,老想回家尽快睡觉. 今天说是要搞oauth认证的东西,看的一头雾水. 想的太简单了.其实也不难.apache的东西,都封装好的. ...
- 第一百九十六天 how can I 坚持
老妈邮的咸菜到了,美味啊,买不到,哈哈. 以后要勤给鱼换水啊,10天不换,水都臭了,拒绝懒惰. 明天要回济南了,刘松结婚,估计又没法发博客了. 两条鱼,一条罗娜,一条我,哈哈. 睡觉.
- Flume日志收集
进入 http://blog.csdn.net/zhouleilei/article/details/8568147
- 山东意外险风险信息推送V7非车
<?xml version="1.0" encoding="GBK"?><Packet type="REQUEST" ve ...