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

安卓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条)

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错