未知昵称
2020-07-15 16:41
采纳率: 89.7%
浏览 271

安卓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条回答 默认 最新

  • pqNZ 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);
    
        }
    

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

    点赞 打赏 评论
  • j315105639 2020-07-15 17:01

    有些地方不明确。
    从代码来看getJson应该是从网络上拉取数据返回一个json体并且转换成JsonArray对象,但是android是无法在主线程进行网络请求的,如果getJson内部做了异步请求,那么又怎么会同步返回JsonArray对象呢?

    点击btn2可以遍历jsonArray。看你的意思btn2也是个button,既然是button的点击事件,你是怎么把jsonArray传递给btn2的事件方法体的?

    如果你是新手,可以把getJson的代码也贴出来,把btn2的代码也贴出来。这样方便替你排查哪地方有问题

    点赞 打赏 评论
  • 浴火_凤凰 2020-07-15 17:58

    应该是异步的问题 从网络获取数据 JS的写法都是使用回调。安卓的话感觉也应该类似吧
    jsonArray= getJson("https://ip:port/account/list");这行代码 如果执行的时候 数据回来之前
    会卡主的话 下面的遍历就不会是空的。
    说白了就是网络取数据需要时间的 你遍历的代码确定在数据取回来之后再执行就没事了
    或者遍历代码加延迟时间 也可以

    点赞 打赏 评论
  • 代码的灵魂是bug! 2020-07-15 18:36

    请求接口是需要时间的,你在button里面执行那两段代码,会一次执行完,根本不会等你获取到数据,所以你第2步就会是个空的数组

    点赞 打赏 评论