Search code examples
javaandroidandroid-volley

how to return JSONArray from method using volley?


I'm trying to return JSONArray on my method.

I want to see

String test = getremseat("20220827", "0671801", "3112001").toString();`        
Log.i("test", test);'

but result is I/test: []

I think getremseat method does not return because of queue.add(req); how can I return JSONArray from the method using Volley?

MainActivity.java:

package com.example.terapi3;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;


import com.android.volley.AuthFailureError;
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;

import java.util.HashMap;
import java.util.Map;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate (Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String test = getremseat("20220827", "0671801", "3112001").toString();
        Log.i("test", test);
    }

    public JSONArray getremseat (String timDte, String terFrI, String terToI) {
     /*
        String timDte = "20220826";
        String terFrI = "0671801";
        String terToI = "3112001";
    */

        JSONArray ja = new JSONArray();

        // GET requset url
        String url = "https://apigw.tmoney.co.kr:5556/gateway/xzzIbtListGet/v1";
        String timTimI = "0000";  //

        RequestQueue queue = Volley.newRequestQueue(this);


        JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url + "/ibt_list" + "/" + timDte + "/" + timTimI + "/" + terFrI + "/" + terToI + "/9/0",
                null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

                try {
                    JSONArray jsonArray = response.getJSONObject("response").getJSONArray("LINE_LIST");


                    for (int a = 0; a < jsonArray.length(); a++) {
                        JSONObject jo = jsonArray.getJSONObject(a);

                        JSONObject joo = new JSONObject();
                        joo.put("TIM_TIM", jo.getString("TIM_TIM"));
                        joo.put("LIN_TIM", jo.getString("LIN_TIM"));
                        joo.put("REM_CNT", jo.getString("REM_CNT"));

                        ja.put(joo);

                    }
                    

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("e", "Site Info Error: " + error.getMessage());
            }
        }) {
            // header
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("x-Gateway-APIKey", "MY PERSONAL KEY");
                return headers;
            }


        };


        queue.add(req);
        return ja; // i want to return this
    }

}

And, I also want return JSONArray to other package.


Solution

  • You're getting an empty JSONArray because you're logging in before the API gives the response.

    You can solve this problem by making a callback method to call after you get the API response.

    Example

    onCreate

    private String test = "";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        getremseat("20220827", "0671801", "3112001").toString();
    }
    

    getremseat

    . . .
    
    for (int a = 0; a < jsonArray.length(); a++) {
          JSONObject jo = jsonArray.getJSONObject(a);
    
          JSONObject joo = new JSONObject();
          joo.put("TIM_TIM", jo.getString("TIM_TIM"));
          joo.put("LIN_TIM", jo.getString("LIN_TIM"));
          joo.put("REM_CNT", jo.getString("REM_CNT"));
          ja.put(joo);
    }
    test = ja.toString(); <-----
    onResult(ja);         <-----
    
    . . .
    

    onResult

    public void onResult (JSONArray jsonArray){
        Log.d("tag", jsonArray.toString());
    }