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

来源:互联网 发布:满汉老干妈知乎 编辑:程序博客网 时间:2024/06/14 13:54

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

否则Android会自动抛出ANR。

页面显示如下

<?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:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="httpurlconnection.wineworld.lizhijie.a2_.MainActivity">    <EditText        android:id="@+id/et_url"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入网址"        />    <Button        android:text="查看源码"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="requestUrl"/>    <ScrollView        android:id="@+id/scrollView"        android:layout_width="fill_parent"        android:layout_height="match_parent"        android:scrollbarStyle="outsideOverlay" android:background="@android:drawable/edit_text">        <TextView            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:id="@+id/textView"            />    </ScrollView></LinearLayout>

具体的操作流程如下

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;        }    }

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



原创粉丝点击