未知昵称 2020-07-15 16:41 采纳率: 66.7%
浏览 325
已采纳

安卓app测试获取接口返回数据,然后处理数据,放在一个button点击事件里面 执行顺序有问题?无法获取数据?

private     JSONArray  jsonArray;
     btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

    //1、访问接口方法,返回系统账户名list为json数组
    jsonArray=  getJson("https://ip:port/account/list");

    //2、遍历jsonArray数组内容
         for(int i = 0; i < jsonArray.length(); i ++) {
                try {
                    Log.e(TAG, "操作员列表:" + jsonArray.get(i).toString());
                    mList.add(jsonArray.get(i).toString());
                    } catch (JSONException e) {
                         e.printStackTrace();
               }
       }

                               }
        });

这两个步骤放在一个button点击事件,获取的jsonArray为空???
但是如果点击btn1 执行获取jsonArray接口事件,点击btn2 遍历jsonArray,就可以正常获取jsonArray数据。。这是啥原因??

public JSONArray getJson(String url){
        OkGo.post(url_).tag("tag")
                .execute(new ResponseCallback<String>(OperateInfoActivity.this) {
                    @Override
                    public void onSuccess(String o, Call call, Response response) {
                        super.onSuccess(o, call, response);
                        try {
                            Log.e("Login", "-- sucess " + o);
                            if (o != null) {
                                String responseStr = new String(o);
                                Log.e(TAG, "响应数据:" + responseStr);
                                JSONObject resultObject = new JSONObject(responseStr);
                                int errCode = resultObject.getInt("errCode");
                                String msg = resultObject.getString("msg");
                                message = msg;
                                Log.e(TAG, "message:" + message);
                                if (errCode == 200) {
                                    String data = resultObject.getString("data");
                                    JSONObject dataObject = new JSONObject(data);

                                    jsonArray = (JSONArray) dataObject.get("operatorList");
                                } else {

                                }
                            }
                        } catch (Exception e) {

                        }
                    }
                });
            return jsonArray;
    }
    private void showMsg(final String msg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(OperateInfoActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

}

  • 写回答

4条回答 默认 最新

  • okay哥 2020-07-16 08:57
    关注
    1. 造成问题的原因: JSONArray getJson(String url)该方法中的post是异步执行的。你按键onClick方法只是发起了请求,请求的结果时异步获取的,就是你的onSuccess()方法。 所以在你的按键onClick方法遍历jsonArray数组内容,还没有获取网络返回数据。
    2. 修改建议: 可以在JSONArray getJson(String url)方法中设计一个回调接口,如:void getJson(String url,CallBack getJsonCallBack),这样你在异步获取网络请求 成功的方法onSuccess回调这个getJsonCallBack,再去遍历结果就好。
    public interface CallBack
        {
            //处理getJson网络请求数据
            public void getJsonCallBack(JSONArray data);
    
        }
    

    当然你还要根据你的使用情况,处理数据使用流程,返回异常等情况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境