Android主线程等待子线程执行结果
2018-01-16 15:45
447 查看
1.场景描述
在主线程复杂逻辑中,有时候想获取网络数据或者其他一些必须放在子线程中操作的业务时,一般都要新开线程,等待线程执行完成之后使用Handler发送到主线程,然后主线程再往下执行,这样的多次切换会造成逻辑复杂难懂.可不可以直接在主线程等待一小段时间,等线程处理完成之后再继续往下执行?
2.实现主线程等待线程返回结果(以解析域名为例)
解析域名的类
在一个按钮的点击事件里面调用(点击事件是在主线程的)
关键句是thread.join(4000);主线程会等待线程4秒,不管线程有没有执行完,主线程在4秒后都会向下执行.
参考:Java多线程中join方法的理解
在主线程复杂逻辑中,有时候想获取网络数据或者其他一些必须放在子线程中操作的业务时,一般都要新开线程,等待线程执行完成之后使用Handler发送到主线程,然后主线程再往下执行,这样的多次切换会造成逻辑复杂难懂.可不可以直接在主线程等待一小段时间,等线程处理完成之后再继续往下执行?
2.实现主线程等待线程返回结果(以解析域名为例)
解析域名的类
public class HostParser implements Runnable{ private String host = ""; private String[] ipAddressArr = null; public HostParser(String host) { this.host = host; } @Override public void run() { String[] ipAddressArrTemp = parseHostGetIPAddress(host); setIpAddressArr(ipAddressArrTemp); } public synchronized void setIpAddressArr(String[] ips) { this.ipAddressArr = ips; } public synchronized String[] getIpAddressArr() { return ipAddressArr; } /** * 解析域名获取IP数组 * @param host * @return */ private String[] parseHostGetIPAddress(String host) { String[] ipAddressArr = null; try { InetAddress[] inetAddressArr = InetAddress.getAllByName(host); if (inetAddressArr != null && inetAddressArr.length > 0) { ipAddressArr = new String[inetAddressArr.length]; for (int i = 0; i < inetAddressArr.length; i++) { ipAddressArr[i] = inetAddressArr[i].getHostAddress(); } } } catch (UnknownHostException e) { e.printStackTrace(); return null; } return ipAddressArr; } }
在一个按钮的点击事件里面调用(点击事件是在主线程的)
private void onBtnClick() { String[] hostArr = {"www.baidu.com", "www.taobao.com", "www.tmall.com"}; for (String host : hostArr) { String[] ips = getIPAddressArr(host); if (ips != null && ips.length > 1) { for (String ip : ips) { Log.i("testLog", host + "--->ip=" + ip); } } else { Log.i("testLog", host + "--->ip=null"); } } } private String[] getIPAddressArr(String host) { String[] ipAddressArr = null; try { HostParser hostParser = new HostParser(host); Thread thread = new Thread(hostParser); thread.start(); thread.join(4000); ipAddressArr = hostParser.getIpAddressArr(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return ipAddressArr; }
关键句是thread.join(4000);主线程会等待线程4秒,不管线程有没有执行完,主线程在4秒后都会向下执行.
参考:Java多线程中join方法的理解
相关文章推荐
- Java多线程--让主线程等待所有子线程执行完毕
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- Java多线程--让主线程等待所有子线程执行完毕(转)
- Java主线程等待所有子线程执行完毕再执行解决办法集
- Java多线程--让主线程等待所有子线程执行完毕
- java主线程等待所有子线程执行完毕在执行
- Android 开子线程工作并用监听器传回结果到主线程--子线程与主线程通信
- Java多线程--让主线程等待所有子线程执行完毕
- 主线程等待所有子线程完成后再执行
- [Java][Android] 多线程同步-主线程等待全部子线程完毕案例
- 搜集所有子线程结果给主线程然后再执行剩下逻辑的几种方式
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
- Java多线程--让主线程等待所有子线程执行完毕
- Java多线程--让主线程等待所有子线程执行完毕代码
- 主线程等待所有子线程完成后再执行
- android 线程辅助处理类(用于在主线程和其他线程中执行逻辑)
- Java多线程--让主线程等待所有子线程执行完毕
- 主线程等待所有子线程完成后再执行
- 主线程等待所有子线程完成后再执行