软件界面
用ScrollVie包裹TextView显示源码
MainActivity.java
package com.peng.html_look;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView tv_result;
private EditText et_path;
private Handler handler;
private String content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_result = (TextView) findViewById(R.id.tv_result);
et_path = (EditText) findViewById(R.id.et_path);
handler = new Handler();
}
public void click(View view) {
new Thread() {
public void run() {
html();
}
}.start();
}
private void html() {
//访问网络代码
try {
//获取源码路径
String path = et_path.getText().toString().trim();
//创建一个URL 对象指定我们要访问的网址(路径)
URL url = new URL(path);
//拿到httpurlconnection对象,用于发射或接收数据
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置发送get请求,get要求大写,默认get请求
conn.setRequestMethod("GET");
//设置请求超时时间
conn.setConnectTimeout(5000);
//获取服务器返回的状态码
int code = conn.getResponseCode();
//code 为200,则请求成功
if (code == 200) {
//从服务器返回数据,以流的形式返回,由于把流转换成字符很常见,封装成一个方法
InputStream inputStream = conn.getInputStream();
//使用工具类把inputstream 转换成string
content = StreamTools.readStream(inputStream);
handler.post(runnableUi);
/* //把流的数据展示到textview上,子线程不能更新UI
tv_result.setText(content);*/
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 构建Runnable对象,在runnable中更新界面
Runnable runnableUi = new Runnable() {
@Override
public void run() {
//更新界面
tv_result.setText("the Content is:" + content);
}
};
}
StreamTools.java
package com.peng.html_look;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
/**
* 读取流中的数据
* <p>
* inputStream输入流转换成一个String
* Created by Peng on 2016/7/28.
*/
public class StreamTools {
//静态方法可以直接通过类名使用
public static String readStream(InputStream inputStream) throws Exception {
//定义内存输出流
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//定义缓存区
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
/**
* write (byte[] buffer, int offset, int len)
* 0缓冲 1初始位置 2缓冲区写的字节数
* 缓冲区被写入。
* 从0到len的长度,写入缓存buffer中
*/
}
inputStream.close();
//把内存输入流读取到content中
String content = new String(outStream.toByteArray());
return content;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.peng.html_look.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_path"
android:hint="请输入查看的网址"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="查看"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000000"
android:id="@+id/tv_result"/>
</ScrollView>
</LinearLayout>
权限
<uses-permission android:name="android.permission.INTERNET"/>
子线程里更新UI的方法
- runOnUiThread
在子线程里直接用 runOnUiThread 在里面执行更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_result.setText("the Content is:" +content);
}
});
- Handler+Runnable
在子线程里 handler.post(r) r为执行的任务
r里的方法去执行更新UI的任务
...void html(){
....
//在子线程里
handler.post(runnableUi);
....
}
----------
// 在主线程中构建Runnable对象,在runnable中更新界面
Runnable runnableUi = new Runnable() {
@Override
public void run() {
//更新界面
tv_result.setText("the Content is:" + content);
}
};
- Handler handleMessage
在子线程里 handler.sendMessage 发数据
在Handler里的handleMessage 处理数据
private static SHOW_CONTENT = 1;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_CONTENT:
String content= (String) msg.obj;
// 在这里进行UI操作,将结果显示到界面上
tv_result.setText("the Content is:" + content);
}
}
};
----------
...void html(){
....
//在子线程里
Message message = new Message();
message.what = SHOW_CONTENT;
// 将服务器返回的结果存放到Message中
message.obj = content;
handler.sendMessage(message);
}