今天试验写android获得web交互,仿照李兴华的web服务器交换数据。
添加了一些新的功能,即在EditText中输入用户名和密码,然后生成url,反馈给http,并解析获得数据。
实现时点击button,出现了android.os.NetworkOnMainThreadException这个错误,错误行定位在下面感叹号的地方。
public boolean connect(String username , String password) {
// String username , String password
try {
URL url = new URL("http", "192.168.1.102", 8080,
"/test/android.jsp?id=" + username + "&password=" + password);
// URL url = new URL("http", "192.168.1.102", 8080,
// "/test/android.jsp?id=youjie&password=123");
HttpURLConnection http = (HttpURLConnection) url.openConnection();
byte data[] = new byte[512];
//!!!!! 注意这行,需要获得输入流时
int len = http.getInputStream().read(data);
if (len > 0) {
// 构造一个字符串
String str = new String(data, 0, len).trim();
return Boolean.parseBoolean(str);
}
http.getInputStream().close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return false;
}
查了一下网上有关这个的错误信息,说是访问网络不能在主线程中进行,心想行啊,起个runnable不就可以了么,然后点击按钮触发的事件时启动这个线程,然后得到反馈的数据更新ui。
可以问题又来了,报这个错误Only the original thread that created a view hierarchy can touch its views ,大概意思是只有原始线程才能修改其组建。
解决方法,大神的,来:http://blog.csdn.net/shenyuemei/article/details/11030679
采用了官方建议的方法,使用了runOnUiThread()这个方法,来更新ui。
public void startThread() {
Runnable runable = new Runnable() {
// 调用connet放方法从http端获得数据
@Override
public void run() {
flag = connect(one.getText().toString(), two.getText().toString());
// 注意这句:使用系统的更新ui界面的线程
MainActivity.this.runOnUiThread(updateThread);
}
};
// 更新UI界面的线程
updateThread = new Runnable() {
@Override
public void run() {
tx.setText(String.valueOf(flag));
}
};
// 启动连接http端的线程
new Thread(runable).start();
}
ok,问题解决,具体项目代码: