- 网页源码查看器
- 代码实现步骤
- [1]搭建UI
- [2]httpurlconnection类基本用法
@OnClick(R.id.btn)
public void onViewClicked() {
final String url = mEt.getText().toString().trim();
if (TextUtils.isEmpty(url)) {
Toast.makeText(this, "网址不能为空" + url, Toast.LENGTH_SHORT).show();
}
new Thread(new Runnable() {
@Override
public void run() {
try {
URL Url = new URL(url);
HttpURLConnection
conn = (HttpURLConnection) Url.openConnection();
int code = conn.getResponseCode();
Log.d(TAG, "run: " + code);
if (code == 200) {
InputStream is = conn.getInputStream();
Log.d(TAG, "run: " + is);
String name = StreamUtils.StreamToString(is);
Log.d(TAG, "run: " + name);
Message message = mHandler.obtainMessage();
message.obj = name;
mHandler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public class StreamUtils {
private static ByteArrayOutputStream mBaos;
public static String StreamToString(InputStream is) {
try {
mBaos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = is.read(buf)) != -1) {
mBaos.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
return mBaos.toString();
}
}
<uses-permission android:name="android.permission.INTERNET" />
-
-
- 当加上权限后 也会报如下错误
- android.os.NetworkOnMainThreadException 主线程(UI线程)访问网络的异常. 主线程这个概念是谷歌提出的.
- 为什么会报这个异常.谷歌要求 在主线程不能进行耗时(拷贝数据 连接网络)的操作,如果在主线程中进行耗时操作会报anr(应用无响应)异常; 如何解决?我们可以自己创建一个线程 来访问网络.
- [5]当我们把访问访问的操作放到子线程又会报如下错误:
- android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
- 只有主线程(UI线程)才可以更新UI
- [6].handler(助手)的使用 —->负责线程的切换
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d(TAG, "handleMessage: callback");
return false;
}
}) {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, "handleMessage: handlemessage");
String name = (String) msg.obj;
mTv.setText(name);
super.handleMessage(msg);
}
};
Message message = mHandler.obtainMessage();
message.obj = name;
mHandler.sendMessage(message);
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</ScrollView>
-
-
- 注意:scrollView控件只能包裹一个孩子.如果想包裹多个在外面套一个布局.