您的位置:首页 > 移动开发 > Android开发

Android主线程等待子线程执行结果

2018-01-16 15:45 447 查看
1.场景描述

在主线程复杂逻辑中,有时候想获取网络数据或者其他一些必须放在子线程中操作的业务时,一般都要新开线程,等待线程执行完成之后使用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方法的理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程