线程同步问题
public AdData getAdData(final Context context, final AdShowOperateData adShowOperateData) {
//如果请求参数不为空
ua = PhoneUtils.getUA(context);
final String jsonRequest = getRequestMap(context,adShowOperateData);
Log.e("请求参数",jsonRequest);
if (!TextUtils.isEmpty(jsonRequest)){
//请求广告数据
new Thread(new Runnable() {
@Override
public void run() {
//网络请求json数据
jsonResponse = XNetWorkUtils.doJsonPost(context,APIURL, jsonRequest, ua);
LogTool.e("响应的数据:",jsonResponse);
try {
if (!TextUtils.isEmpty(jsonResponse)) {
//数据解析
adData = Json.jsonJinchengToADBean(jsonResponse);
//如果解析有广告数据填充,启动展示页面
if (adData != null) {
Intent intent = new Intent(context, ADActivity.class);
//广告数据
intent.putExtra("adData",adData);
//广告类型
intent.putExtra("adType",adShowOperateData.getOperateAdType());
//展示类业务的ID
intent.putExtra("operateId",adShowOperateData.getOperateId());
//广告误点率
intent.putExtra("adClicktrack",adShowOperateData.getAdClicktrack());
context.startActivity(intent);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
return adData;
}
方法返回的对象是不是可能是空的,这样子的话要怎么处理才能让返回是在子线程执行完后的呢,各位大佬帮帮忙吧
public interface OnGetAdDataListener{
onGetAdData(AdData adData):
}
public void getAdData(final Context context, final AdShowOperateData adShowOperateData,OnGetAdDataListener onGetAdDataListener) {
//如果请求参数不为空
ua = PhoneUtils.getUA(context);
final String jsonRequest = getRequestMap(context,adShowOperateData);
Log.e("请求参数",jsonRequest);
if (!TextUtils.isEmpty(jsonRequest)){
//请求广告数据
new Thread(new Runnable() {
@Override
public void run() {
//网络请求json数据
jsonResponse = XNetWorkUtils.doJsonPost(context,APIURL, jsonRequest, ua);
LogTool.e("响应的数据:",jsonResponse);
try {
if (!TextUtils.isEmpty(jsonResponse)) {
//数据解析
adData = Json.jsonJinchengToADBean(jsonResponse);
//如果解析有广告数据填充,启动展示页面
if (adData != null) {
if(onGetAdDataListener!=null){
onGetAdDataListener.onGetAdData(adData);
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
}
public class A imple OnGetAdDataListener {
onGetAdData(AdData adData){
//应该用Handle 放在主线程处理,这里我就不写了
Intent intent = new Intent(context, ADActivity.class);
//广告数据
intent.putExtra("adData",adData);
//广告类型
intent.putExtra("adType",adShowOperateData.getOperateAdType());
//展示类业务的ID
intent.putExtra("operateId",adShowOperateData.getOperateId());
//广告误点率
intent.putExtra("adClicktrack",adShowOperateData.getAdClicktrack());
context.startActivity(intent);
}
}
如果你不知道写这个代码,说明你还不懂回调接口,建议你可以去我主页看看设计模式的文章,更好的理解代码中的架构,怎么设计架构,让代码更容易扩展。
接着讲解你目前的代码,当我们在A线程中想要监听B线程执行结果,只要在A中用回传接口监听B的事件,当B完成就通知A。而且当我们不是在主线程中回传接口时,要想操作UI操作,必须通过handle在主线程执行。
和我刚编程时的想法一样。这种异步请求数据,只能用接口回调返回结果,就是上家的代码那样。