[TOC]
输入网址,那可查看目标网页的HTML源码
1. 写布局
线性 + EditText + Button + TextView
2. 写业务逻辑
- 找控件
- 设置按钮点击事件
- 当用户点击按钮时,获取用户输入的url
- 我们通过URLConnection请求网络,获取服务器返回的流信息
- 我们将流转换成字符串
- 将源码字符串展示到textview上
示例代码
HttpUrlConnection连接示例
//连网的耗时操作需要启动子线程,并添加INTERNET权限
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(url_str);
HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();
openConnection.setRequestMethod("GET");
openConnection.setConnectTimeout(10 * 1000);
int code = openConnection.getResponseCode();
if(code == 200) {
//返回的状态码为200,表示请求成功,获取连接的输出流,接收服务器的返回数据
InputStream is = openConnection.getInputStream();
//处理返回数据的实现代码
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
流转字符串模块代码
public static String streamToString(InputStream inputStream) {
try {
//将数据写入到内存中,再将字节数组转成字符串
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = inputStream.read(buf)) > 0) {
bos.write(buf, 0, len);
}
String result = bos.toString();
// bos.close();//可关可不关,无效
inputStream.close();
return result;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
网络编程的注意事项:
权限问题;
<uses-permission android:name="android.permission.INTERNET"/>
异常:java.net.SocketException: Permission denied手机访问自己电脑的url时,需要指定ip地址,不要用localhost;
编码问题: android设备的默认编码是utf-8; 静态web资源,或动态web资源也需要是utf-8
ANR异常 , anr: application not response; 由于主线程被阻塞就会报这个错误.
ANR in com.itheima.looksource (com.itheima.looksource/.MainActivity)网络在主线程异常 由于网络请求是耗时的操作,容易导致主线程阻塞从而导致ANR;所以谷歌从android4.0以后强制要求网络请求必须方法子线程,如果放到主线程就报该错。
android.os.NetworkOnMainThreadExceptionCalledFromWrongThreadException,从错误的线程调用异常; 谷歌规定:只有主线程(mian, 原始的线程,UI线程)才能够更新UI(更改控件的属性或值);子线程不能够更新UI;
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.注意: 耗时的操作必须放到子线程中执行,网络请求就属于耗时的操作; 我们将网络请求放到子线程中了,获取到了数据,我们想更新UI,但是谷歌又告诉更新UI,不能放到子线程中,只能放到主线程中;所以我们产生了矛盾; 采用Handler解决;