方法未按时间顺序调用

时间:2019-10-11 18:26:02

标签: java android android-volley jsonobjectrequest

我试图按时间顺序调用函数,但是函数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,但不会完成该功能。

1 个答案:

答案 0 :(得分:2)

在每个功能parseJSON()parseJSONTWO()中,您正在发出异步网络请求。网络请求不是立即的,需要几毫秒到几十毫秒的时间,这比程序执行的速度要慢得多。由于网络请求需要花费一些时间来解决相应的onResponse()功能,因此相关请求返回时也会延迟并触发。

因此,代码中的操作顺序为

  1. 调用parseJSON()会启动一个需要一段时间的GET请求
  2. 调用parseJSONTwo()会启动另一个GET请求,而无需等待parseJSON()的GET请求的响应,这可能还需要一段时间。

在启动GET请求后,函数parseJSONTwo()返回之后,立即调用函数parseJSON(),由于GET请求可能需要一段时间,因此可能尚未完成。因此,当调用函数parseJSON()启动下一个GET请求时,parseJSONTwo()的GET请求可能仍在处理中,而没有响应。

每个请求返回时,将触发其onResponse()回调。但是,未指定它们返回的顺序。这将取决于服务器和网络状况以及每个请求完成所需的时间。

由于函数parseJSONTwo()需要函数parseJSON()的响应,因此必须链接这些函数,以便仅在第一个函数的响应时调用第二个函数parseJSONTwo()。函数的GET请求已收到。

链接这些函数的一种方法是在函数parseJSONTwo()的{​​{1}}处理程序中调用函数OnResponse()