我试图按时间顺序调用函数,但是函数parseJSONTwo()
似乎在函数parseJSON()
之前执行(两个函数都只是从URL提取JSON数据)
package com.example.rechev;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class pratim extends AppCompatActivity {
RequestQueue queue;
TextView degem;
String model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pratim);
degem = findViewById(R.id.pratim);
queue = Volley.newRequestQueue(this);
parseJSON();
parseJSONTwo();
}
public void parseJSON() {
Intent intent = getIntent();
int number = intent.getIntExtra("inumber", 1234567);
String url = "http://apiurl.com" + number}";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject result = response.getJSONObject("res");
JSONArray jsonArray = result.getJSONArray("rec");
String test = result.getString("total");
if (Integer.parseInt(test) == 1) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject number = jsonArray.getJSONObject(i);
String carMaker = number.getString("toze");
degem.append(String.valueOf("\n maj: " + carMaker));
model = number.getString("degem_nm");
if (carGimur.length() >= 1) {
degem.append(String.valueOf("\n type: " + carGimur));
}
}
} else {
degem.append("invalid");
}
} catch (JSONException e) {
degem.append(e.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
degem.append("Error");
}
});
queue.add(request);
}
public void parseJSONTwo() {
String url = "http://apiurl.com"+model}";
JsonObjectRequest requestt = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject result = response.getJSONObject("res");
JSONArray jsonArray = result.getJSONArray("rec");
String test = result.getString("total");
if (Integer.parseInt(test) == 1) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject number = jsonArray.getJSONObject(i);
String carNefah = number.getString("nefah_manoa");
degem.append(String.valueOf("num: " + carNefah));
}
}
} catch (JSONException e) {
degem.append(e.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
degem.append("Error");
}
});
queue.add(requestt);
}
}
函数parseJSON()
从url
获取JSON数据并将其放入TextView
,并且它还为全局变量(模型)设置了一个值,parseJSONTWO()
使用在其URL中,以便它可以根据第一个parseJSON()
函数获取数据。
问题是parseJSONTwo()
由于某种原因被首先调用,因此它无法使用parseJSON()
检索到的信息。
更新的代码:
package com.example.rechev;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class pratim extends AppCompatActivity {
RequestQueue queue;
TextView degem;
String model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pratim);
degem = findViewById(R.id.pratim);
queue = Volley.newRequestQueue(this);
parseJSON();
}
public void parseJSON() {
Intent intent = getIntent();
int number = intent.getIntExtra("inumber", 1234567);
String url = "http://apiurl.com" + number}";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject result = response.getJSONObject("res");
JSONArray jsonArray = result.getJSONArray("rec");
String test = result.getString("total");
if (Integer.parseInt(test) == 1) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject number = jsonArray.getJSONObject(i);
String carMaker = number.getString("toze");
degem.append(String.valueOf("\n maj: " + carMaker));
model = number.getString("degem_nm");
if (carGimur.length() >= 1) {
degem.append(String.valueOf("\n type: " + carGimur));
}
}
} else {
degem.append("invalid");
}
if(model.length() >= 1){
parseJSONTwo();
}
} catch (JSONException e) {
degem.append(e.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
degem.append("Error");
}
});
queue.add(request);
}
public void parseJSONTwo() {
String url = "http://apiurl.com"+model}";
JsonObjectRequest requestt = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject result = response.getJSONObject("res");
JSONArray jsonArray = result.getJSONArray("rec");
String test = result.getString("total");
if (Integer.parseInt(test) == 1) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject number = jsonArray.getJSONObject(i);
String carNefah = number.getString("nefah_manoa");
degem.append(String.valueOf("num: " + carNefah));
}
}
} catch (JSONException e) {
degem.append(e.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
degem.append("Error");
}
});
queue.add(requestt);
}
}
现在parseJSONTwo
将获得正确的URL,但不会完成该功能。
答案 0 :(得分:2)
在每个功能parseJSON()
和parseJSONTWO()
中,您正在发出异步网络请求。网络请求不是立即的,需要几毫秒到几十毫秒的时间,这比程序执行的速度要慢得多。由于网络请求需要花费一些时间来解决相应的onResponse()
功能,因此相关请求返回时也会延迟并触发。
因此,代码中的操作顺序为
parseJSON()
会启动一个需要一段时间的GET请求parseJSONTwo()
会启动另一个GET请求,而无需等待parseJSON()
的GET请求的响应,这可能还需要一段时间。在启动GET请求后,函数parseJSONTwo()
返回之后,立即调用函数parseJSON()
,由于GET请求可能需要一段时间,因此可能尚未完成。因此,当调用函数parseJSON()
启动下一个GET请求时,parseJSONTwo()
的GET请求可能仍在处理中,而没有响应。
每个请求返回时,将触发其onResponse()
回调。但是,未指定它们返回的顺序。这将取决于服务器和网络状况以及每个请求完成所需的时间。
由于函数parseJSONTwo()
需要函数parseJSON()
的响应,因此必须链接这些函数,以便仅在第一个函数的响应时调用第二个函数parseJSONTwo()
。函数的GET请求已收到。
链接这些函数的一种方法是在函数parseJSONTwo()
的{{1}}处理程序中调用函数OnResponse()
。