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();
}
});
}
}
public interface CallBack
{
//处理getJson网络请求数据
public void getJsonCallBack(JSONArray data);
}
当然你还要根据你的使用情况,处理数据使用流程,返回异常等情况。
有些地方不明确。
从代码来看getJson应该是从网络上拉取数据返回一个json体并且转换成JsonArray对象,但是android是无法在主线程进行网络请求的,如果getJson内部做了异步请求,那么又怎么会同步返回JsonArray对象呢?
点击btn2可以遍历jsonArray。看你的意思btn2也是个button,既然是button的点击事件,你是怎么把jsonArray传递给btn2的事件方法体的?
如果你是新手,可以把getJson的代码也贴出来,把btn2的代码也贴出来。这样方便替你排查哪地方有问题
应该是异步的问题 从网络获取数据 JS的写法都是使用回调。安卓的话感觉也应该类似吧
jsonArray= getJson("https://ip:port/account/list");这行代码 如果执行的时候 数据回来之前
会卡主的话 下面的遍历就不会是空的。
说白了就是网络取数据需要时间的 你遍历的代码确定在数据取回来之后再执行就没事了
或者遍历代码加延迟时间 也可以
请求接口是需要时间的,你在button里面执行那两段代码,会一次执行完,根本不会等你获取到数据,所以你第2步就会是个空的数组