上课时候老师说的是子线程不能更新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:1]当中对此的主要分析如下:
看到上边方法中抛出的异常是不是感觉很熟悉,对,没错,就是我log中截出来的那句话!!那么我们现在懵逼了,为什么我们在不让子线程休眠的情况下去更新TextView文本可以,而让线程休眠两秒后就出抛异常呢?根本原因就是ViewRootImpl到底是在哪里被初始化的!ViewRootImpl是在onResume中初始化的,而我们开启的子线程是在onCreat方法中,这个时候程序没有去检测当前线程是不是主线程,所以没有抛异常!!下边我们去看ActivityThread源码,去找出原因!!
详细的分析需要去看原文
至于正统的方法,一般是用Handler等[2]
因为网络可能有延迟,所以数据的请求和接收要在子线程当中完成
收到数据后,通过handler将数据发送到主线程,完成更新
Android可不可以在子线程中更新UI? ↩︎ ↩︎
Android开发——实现子线程更新UI ↩︎