Android查看网页源码与开启子线程

在Android4.0以后,只要涉及下载,读取都需要在子线程里面进行。

否则Android会自动抛出ANR。

页面显示如下




    

    

具体的操作流程如下

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

        private EditText editText;
        private TextView textView;
        //[3.2]在主线程新家
        private Handler handler=new Handler(){
            //[3.3]重写该方法,获取子线程数据,更新主线程页面
            @Override
            public void handleMessage(Message msg) {
                //[3.5.1]获取消息,更新UI
                textView.setText(msg.obj.toString());//在这里就直接赋值了。没有进行判断
            }
        };

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            editText=(EditText) findViewById(R.id.et_url);
            textView=(TextView)findViewById(R.id.textView);
        }

        public void requestUrl(View view)  {

            //[3.1]新建子线程
            new Thread(){
                @Override
                public void run() {
                    try{
                        //请求文本之前需要添加 网络权限
                        //[1]获取当前文本框输入的地址
                        String path=editText.getText().toString().trim();
                        //[1.1]将输入的文本,生成URL
                        URL url= new URL(path);

                        //[2.1]生成HttpURLConnection 对象
                        HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
                        httpURLConnection.setRequestMethod("GET");//请求方式
                        httpURLConnection.setConnectTimeout(5000);//请求超时时间
                        int resultCode=httpURLConnection.getResponseCode();//获取请求状态码
                        //200 请求成功
                        //404 没有找到
                        //401权限问题
                        if(resultCode==200){
                            InputStream inputStream=httpURLConnection.getInputStream();//获取数据流
                            String content=getStringByInputStream(inputStream);
                            //textView.setText(content);

                            //[3.4.1]创建发送给主线程的消息
                            Message msg=new Message();
                            msg.obj=content;//更新内容
                            msg.what=106;   //更新的标志
                            handler.sendMessage(msg);
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }


                }
            }.start();
        }

        //将输入流转换成字符
        private String getStringByInputStream(InputStream inputStream)throws Exception{
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = inputStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inputStream.close();
            String content= new String(outSteam.toByteArray());//new String 是为了方便编码格式
            return content;
        }
    }

注意要点:需要开启网页权限。



你可能感兴趣的:(Android基本学习)