I'm try to return JSONArray from other package.
But my log is 'D/test: []'.
how can I return JSONArray from other package?
I want to do
RemSeat r = new RemSeat();
JSONArray aj = r.getremseat(getApplicationContext(),"20220827", "0671801", "3112001");
Log.d("test", aj.toString());
in my MainActivity.
TerCode.java
package remseatcomponent;
import android.content.Context;
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 RemSeat {
public JSONArray getremseat (Context context, String timDte, String terFrI, String terToI) {
/*
String timDte = "20220827";
String terFrI = "0671801";
String terToI = "3112001";
*/
JSONArray ja = new JSONArray();
String url = "https://MY URL"; //myURL
String timTimI = "0000"; //
RequestQueue queue = Volley.newRequestQueue(context);
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 one rrorResponse(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;
}
}
MainActivity.java
package com.example.terapi3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import remseatcomponent.RemSeat;
import android.util.Log;
import org.json.JSONArray;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// I want to do this on MainActivity
RemSeat r = new RemSeat();
JSONArray aj = r.getremseat(getApplicationContext(),"20220827", "0671801", "3112001");
Log.d("test", aj.toString());
}
}
How can I returnJSONArray from other package's method using volley?
CodePudding user response:
The Volley call is asynchronous - this means that the code in your response listener runs later in the future, but your function returns immediately so the list is still empty. Getting things from the internet or a server takes a "long time" so things like this are almost always done with asynchronous APIs.
When using an asynchronous API like this, you cannot return the data (unless you can use a coroutine/suspend function). The way to access this type of data is to use a callback, like shown below:
public class RemSeat {
public interface JsonCallback {
void gotArray(JSONArray ar);
}
public void getremseat (Context context, String timDte, String terFrI, String terToI, JsonCallback callback) {
RequestQueue queue = Volley.newRequestQueue(context);
String path = "make_the_url";
JsonObjectRequest req = new JsonObjectRequest(
Request.Method.GET, path, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
JSONArray ja = new JSONArray();
// populate ja from response, and call the callback
// with the populated array
callback.gotArray(ja);
}
},
new Response.ErrorListener() {
// ...
}
);
queue.add(req);
}
}
Then you can call it like this, providing a callback with the code you want to run once the array is retrieved. Since the code here is still a callback, so the lines inside gotArray
run in the future whenever the array is actually retrieved.
r.getremseat(getApplicationContext(),
"20220827", "0671801", "3112001",
new RemSeat.JsonCallback() {
@Override
public void gotArray(JSONArray ar) {
// anything that needs the array must run in here
Log.d("test", ar.toString());
}
}
);
// this will run BEFORE the Log above gets run