I am unable to make a network call using Volley
Asked Answered
V

4

1

When I am making a network call using jsonObject request. I am not receiving any response. I always receive HTTP response for request=<[ ] before my URL. I have tried these links as well but nothing worked for me.

Android Volley double post when have slow request:

Source1, source2, Source 3

 package com.example.mts3.hammadnewsapp;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

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

import java.util.ArrayList;

public class NewsDetailsActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    NewsAdapter adapter;
    ArrayList<NewsOpen> newsList =new ArrayList<>();
    Intent intent;
    TextView tv_newsheading;

    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    Context context;
    String DATA_URL="http://ec2-54-147-238-136.compute-1.amazonaws.com/hmc/api/getnewsfeeds?order=asc";

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

        Toolbar toolbar =  findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        newsList = new ArrayList<>();
        recyclerView = findViewById(R.id.rv_newsdetails);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new NewsAdapter(this, newsList);

        String string = (String) getText(R.string.random_text);

        newsList.add(new NewsOpen(R.drawable.hdr_bg_plain, "Chief Medical Officer", "10-11-2020", string));
//        newsList.add(new NewsOpen("image!!", "Chief Medical Officer", "10-11-2020", string));

        recyclerView.setAdapter(adapter);
        /*backgroundTask.getList(new BackgroundTask.arrayCallBack() {
            @Override
            public void onSuccess(ArrayList<Contact> contacts) {
                adapter = new RecyclerAdapter(contacts);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onFail(String msg) {
                // Do Stuff
            }
        });*/



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_news_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_share) {

            //Toast.makeText(NewsDetailsActivity.this, "Share menu clicked ", Toast.LENGTH_LONG).show();
            callApi();
            return true;
        }
        if (id == R.id.action_logout) {
            sharedPreferences= PreferenceManager.getDefaultSharedPreferences(this);
            editor= sharedPreferences.edit();
            editor.putBoolean("Verified user",false);
            editor.commit();

            Toast.makeText(NewsDetailsActivity.this,"Logged out ",Toast.LENGTH_LONG).show();
            Intent intent=new Intent(NewsDetailsActivity.this,MainActivity.class);
            startActivity(intent);


            return true;
        }

        return super.onOptionsItemSelected(item);
        }

    private void callApi() {
       // new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
           // int x=3;// retry count
           // DefaultRetryPolicy defaultRetryPolicy=new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS*1,x,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        //DefaultRetryPolicy defaultRetryPolicy= new DefaultRetryPolicy(20 * 1000, 0, 1.0f);
        RequestQueue requestQueue= Volley.newRequestQueue(this);
        //System.setProperty("http.keepAlive", "false");
        JsonObjectRequest jsonObject =new JsonObjectRequest(Request.Method.GET,DATA_URL, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.e("res",response.toString());

            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }

        });
        //int x=2;// retry count
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48, x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        /*jsonObject.setRetryPolicy(
                new DefaultRetryPolicy(
                        500000,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
                )
        );*/
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        //new DefaultRetryPolicy(10000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        //jsonObject.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        //int socketTimeout = 30000;//30 seconds - change to what you want
       // RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
       // jsonObject.setRetryPolicy(policy);
        int custom_timeout_ms = 10000;
        DefaultRetryPolicy policy = new DefaultRetryPolicy(custom_timeout_ms,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        jsonObject.setRetryPolicy(policy);
        requestQueue.add(jsonObject);

    }

}

Error Log for network call

Villeneuve answered 22/12, 2017 at 6:41 Comment(2)
Try using StringRequest check my answer.Nealy
use custom_timeout_ms = 0 or custom_timeout_ms = 20000 because your request is taking time to get the respone.Turanian
A
2

Another Solution using StringRequest to get Json Response

  private void callApi() {
    RequestQueue mrequestQueue;
    StringRequest stringRequest;
    mrequestQueue = Volley.newRequestQueue(this);
    stringRequest = new StringRequest(Request.Method.GET, DATA_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            try {

                JSONObject jsonObject = new JSONObject(response);
                System.out.println("json"+jsonObject);


            } catch (JSONException e) {

                e.printStackTrace();
            }


        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //Log.i(TAG, "Response: " + error.toString());

        }
    });
    mrequestQueue.add(stringRequest);


}

Output image

Alica answered 22/12, 2017 at 7:3 Comment(9)
I have tried this solution as well but it didn't workVilleneuve
i tried your url its working.Just copy paste and try.I am able get dataAlica
What is the issue are getting JSON parsing error?in the response \n\t prefix added you have to fix that.JsonRequest your getting JSONEXCEPTION because of invalid JSONAlica
@R2R SIR!! what is the reason that it is not working with JsonObjectRequest but working for stringRequestCarrier
Actually its working in JsonObjectRequest also error part the data is coming check onerror .The json is not valid thats why error.Default parsing errorAlica
@R2R sir you mean that the data we are receiving as a response from api is in invalid format??Carrier
yes in that response \t\n is there check that responseAlica
@R2R so it is some thing to do with api to validate the json format...or some thing else.?Carrier
Let us continue this discussion in chat.Alica
R
0

if your app is getting completed before response then it is causing connection timeout. you must add connection timeout in volley and retry policy also.Here is an example

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
                url,
                request,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {


                    }
                }, new VolleyErrorListener(this, AuthController.LOGIN_ERROR)) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                return new VolleyHeader().getHeaders();
            }
        };
        jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
                50000,
                0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        NetworkRequestQueue.getInstance(mContext).getRequestQueue().add(jsonObjectRequest);

NetworkRequestQueue class is as follows:

public class NetworkRequestQueue {

    private static NetworkRequestQueue mInstance;
    private static Context mCtx;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;


    private NetworkRequestQueue(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized NetworkRequestQueue getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new NetworkRequestQueue(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 * 1024 * 1024);
            Network network = new BasicNetwork(new HurlStack());
            mRequestQueue = new RequestQueue(cache, network);
            // Don't forget to start the volley request queue
            mRequestQueue.start();
        }
        return mRequestQueue;
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }

}

Ryurik answered 22/12, 2017 at 6:56 Comment(0)
N
0

Try this using String Request

public class TestActivity extends AppCompatActivity {
        RequestQueue requestQueue;
        String DATA_URL = "http://ec2-54-147-238-136.compute-1.amazonaws.com/hmc/api/getnewsfeeds?order=asc";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            requestQueue = Volley.newRequestQueue(this);
            callApi();
        }
    
        private void callApi() {
            StringRequest stringRequest = new StringRequest(Request.Method.GET, DATA_URL, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e("res", response);
                }
    
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("onErrorResponse: ", error.getLocalizedMessage());
                }
    
            });
    
            requestQueue.add(stringRequest);
        }

enter image description here

Nealy answered 22/12, 2017 at 7:8 Comment(0)
T
0

Change your DefaultRetryPolicy with this:

DefaultRetryPolicy policy = new DefaultRetryPolicy(0,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
jsonObject.setRetryPolicy(policy);
Turanian answered 22/12, 2017 at 7:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.