- 网页源码查看器
- 代码实现步骤
- [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(); ???}
- [3]把流转换为String工具类
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(); ???}}
- [4]联网要加上联网权限
???<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(助手)的使用 —->负责线程的切换
- 6.1创建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); ???????} ???};
- 6.2 发消息
???????????????????????Message message = mHandler.obtainMessage(); ???????????????????????message.obj = name; ???????????????????????mHandler.sendMessage(message);
- 7.scrollView 垂直滚动的view
???<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控件只能包裹一个孩子.如果想包裹多个在外面套一个布局.
网页源码查看器
原文地址:https://www.cnblogs.com/nangongyibin/p/10219206.html