Zorrocaesar
Zorrocaesar

Reputation: 748

Get Android Volley response in another class

I'm trying to use Volley as a DBA layer to call a webservice that hadles JSON objects. Because this layer is below the activity and another service layer, it doesn't seem to be working properly. I'll try to explain my setup:

MainActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ProductService productService = new ProductService();
    productService.getProduct();
}

ProductService.java:

    public void getProduct() {
            JsonObjectRequest req = new JsonObjectRequest("http://echo.jsontest.com/name/Milk/price/1.23/", null, createMyReqSuccessListener(), createMyReqErrorListener());
            ApplicationController.getInstance().addToRequestQueue(req);
        }

        private Response.Listener<JSONObject> createMyReqSuccessListener() {
            return new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.v("response", response.toString());
                }
            };
        }

        private Response.ErrorListener createMyReqErrorListener() {
            return new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                   return;
                }
            };
        }

I hope that is clear enough. In the end, I would like to use the ProductService::getProduct() from an activity and the the actual JSON response from the webservice in a variable which I can later use.

However, at the moment, the line

Log.v("response", response.toString());

doesn't even execute. What am I doing wrong?

Upvotes: 1

Views: 3738

Answers (2)

Kapil
Kapil

Reputation: 11

Create an abstract class AppActivity

import androidx.appcompat.app.AppCompatActivity;

public abstract class AppActivity extends AppCompatActivity
{
    abstract void callback(String data);
}

Extend all your Activities using AppActivity

public class MainActivity extends AppActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String url = "Your URL";

        JSONObject jsonBody = new JSONObject();
        try {
            jsonBody.put("Title", "Android Volley Demo");
            jsonBody.put("Author", "BNK");
        }
        catch (JSONException e) {
            System.out.println(e);
        }

        final String requestBody = jsonBody.toString();

        Messenger messenger = new Messenger(MainActivity.this);
        messenger.sendMessage(this, url, requestBody);

    }

    public void callback(String data)
    {
        System.out.println(data);
    }
}

Create Messenger class as below:

public class Messenger
{
    private AppActivity myActivity;

    public  Messenger(AppActivity activity)
    {
        myActivity = activity;
    }

    public void sendMessage(Context context, String url, final String requestBody)
    {
        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(context);

        // Request a string response from the provided URL.
        StringRequest stringRequest =
                new StringRequest(
                        Request.Method.POST,
                        url,
                        null,
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                System.out.println(error);
                            }
                        }
                ) {
                    @Override
                    public String getBodyContentType() {
                        return "application/json; charset=utf-8";
                    }

                    @Override
                    public byte[] getBody() throws AuthFailureError {
                        try {
                            return requestBody == null ? null : requestBody.getBytes("utf-8");
                        }
                        catch (UnsupportedEncodingException uee) {
                            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                            return null;
                        }
                    }

                    @Override
                    protected Response<String> parseNetworkResponse(NetworkResponse response)
                    {
                        myActivity.callback(new String(response.data));

                        String responseString = "";
                        if (response != null) {
                            responseString = String.valueOf(response.statusCode);
                            // can get more details such as response.headers
                        }
                        return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
                    }
                };

        queue.add(stringRequest);
    }
}

Hope it helps.

Upvotes: 1

Lexandar
Lexandar

Reputation: 387

What I would try is this:

Declare getProduct as

public void getProduct(Response.Listener<JSONObject> listener, 
                       Response.ErrorListener errlsn) {
            JsonObjectRequest req = new JsonObjectRequest("http://echo.jsontest.com/name/Milk/price/1.23/",null, listener, errlsn);
            ApplicationController.getInstance().addToRequestQueue(req);
        }

And than call in your activity like this:

productService.getProduct(
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                       variableFromActivity = response;
                       //Or call a function from the activity, or whatever...
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                       //Show error or whatever...
                    }
                });

Upvotes: 3

Related Questions