70OneDay 2020-03-26 09:44 采纳率: 0%
浏览 607

Android线程同步修改变量问题

线程同步问题

    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;
    }

方法返回的对象是不是可能是空的,这样子的话要怎么处理才能让返回是在子线程执行完后的呢,各位大佬帮帮忙吧

  • 写回答

2条回答 默认 最新

  • 有头发的猿 2020-03-26 10:13
    关注
    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在主线程执行。

    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献