上课时候老师说的是子线程不能更新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将数据发送到主线程,完成更新