网页源码查看器

  • 网页源码查看器
    • 代码实现步骤 
    • [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控件只能包裹一个孩子.如果想包裹多个在外面套一个布局.

猜你喜欢

转载自www.cnblogs.com/nangongyibin/p/10219206.html
今日推荐