Android查看网页源码与开启子线程
16lz
2021-01-23
在Android4.0以后,只要涉及下载,读取都需要在子线程里面进行。
否则Android会自动抛出ANR。
页面显示如下
<?xml version="1.0" encoding="utf-8"?>
具体的操作流程如下
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 系统常用权限
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android 给 app默认权限(不弹窗申请权限)
- Android异步加载图像小结 (含线程池,缓存方法)
- android学习轨迹之二:Android权限标签uses-permission的书写位置
- Android异步线程OkHttp Post请求Json数据并解析
- 线程池的封装和使用(二)
- Android studio 简单的多线程
- Android 为线程增加Looper