Android在子线程更新UI

上课时候老师说的是子线程不能更新UI

然而在他讲之前我弄着玩儿…发现竟然是可以的!

接着查了好多资料都说不行

后来终于找到一个符合情况的1

先说说我的代码吧

private TextView Info;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	
	setContentView(R.layout.activity_net);
	// 布局只有一个文本框
	
	Info = findViewById(R.id.Info);
	//绑定文本框
	
	new MyThread().start();

}

    public class MyThread extends Thread{
        //继承Thread类
        public void run(){
        //重写run方法
            Log.i("Info", "Thread");
            String resultData = "";
            try{
                URL url = new URL("https://www.baidu.com");
                //URL对象
                HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
                //打开这个连接
                conn.setConnectTimeout(5000);
                conn.connect();
                InputStream is = conn.getInputStream();
                //获取输入流
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader bufferReader = new BufferedReader(isr);
                String inputLine  = "";
                while((inputLine = bufferReader.readLine()) != null){
                    resultData += inputLine + "\n";
                }
                System.out.println("Success");
            }catch(Exception e)
            {
                e.printStackTrace();
            }

            Info.setText(resultData);

            Log.i("Info", "resultData");
            Log.i("Info", resultData);
        }

    }

在这里插入图片描述

博文1当中对此的主要分析如下:

看到上边方法中抛出的异常是不是感觉很熟悉,对,没错,就是我log中截出来的那句话!!那么我们现在懵逼了,为什么我们在不让子线程休眠的情况下去更新TextView文本可以,而让线程休眠两秒后就出抛异常呢?根本原因就是ViewRootImpl到底是在哪里被初始化的!ViewRootImpl是在onResume中初始化的,而我们开启的子线程是在onCreat方法中,这个时候程序没有去检测当前线程是不是主线程,所以没有抛异常!!下边我们去看ActivityThread源码,去找出原因!!

详细的分析需要去看原文

至于正统的方法,一般是用Handler等2

因为网络可能有延迟,所以数据的请求和接收要在子线程当中完成

收到数据后,通过handler将数据发送到主线程,完成更新


  1. Android可不可以在子线程中更新UI? ↩︎ ↩︎

  2. Android开发——实现子线程更新UI ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值