Why is Volley's onResponse not called

余生颓废 提交于 2019-12-12 17:54:26

问题


I am fetching json data through Volley. The problem I am having is that Volley's onResponse is never called, and hence the data are not parsed and displayed.

Sample JSON data

{
   "title": "This is a sample text title title",
   "cat": {
        "origin" : "United states",
        "target" : "Asia",
   },
   "content": "Lorem ipsum ipsum trxt hag jlak jshss jsyts pjqgq uuqtyq  usiuqjo uwywh",

}

NewsActivity

public class NewsDetails extends AppCompatActivity {

    private final String TAG = "NewsDetails";
    private ProgressDialog mProgresscircle;

    TextView newsTitle, newsOrigin, newsContent;

    //private int news_id;

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

        newsTitle = (TextView) findViewById(R.id.dnews_title);
        newsOrigin = (TextView) findViewById(R.id.dnews_origin);
        newsContent = (TextView) findViewById(R.id.dnews_content);


        if (NetworkCheck.isAvailableAndConnected(this)) {
            //Calling method to load newss
            loadNews();
        } else {
            final Context context;
            context = this;
            final AlertDialog.Builder alertDialog = new  AlertDialog.Builder(this);
            alertDialog.setTitle(R.string.alert_titl);
            alertDialog.setCancelable(false);
            alertDialog.setIcon(R.mipmap.ic_launcher);
            alertDialog.setMessage(R.string.failed_news);
            alertDialog.setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!NetworkCheck.isAvailableAndConnected(context)) {
                        alertDialog.show();
                    } else  {
                        loadNews();
                    }
                }
            });
            alertDialog.setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alertDialog.show();
        }
    }

    private void loadNews() {
        Log.d(TAG, "loadNews called");

        mProgresscircle = new ProgressDialog(NewsDetails.this);
        mProgresscircle.setCancelable(false);
        mProgresscircle.setMessage(null);
        mProgresscircle.show();


        int news_id = getIntent().getIntExtra("NewsId", -1);
        Toast.makeText(NewsDetails.this, "News id is" + news_id, Toast.LENGTH_SHORT).show();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(DetailConfig.GET_DURL + news_id,

                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, "onResponse called NewsDetails");

                        //Dismissing progressbar;
                        if (mProgresscircle != null) {
                            mProgresscircle.dismiss();
                        }

                        //Calling method to parse json array
                        parseNews(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                });

        //Creating request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to queue
        requestQueue.add(djsonArrayRequest);
    }

    //This method will parse json data of news
    private void parseNews(JSONArray jsonArray) {
        Log.d(TAG, "Parsing news array");

        for (int i = 0; i<jsonArray.length(); i++) {
            JSONObject jsonObject = null;
            try {
                jsonObject = jsonArray.getJSONObject(i);
                String title = jsonObject.getString(DetailConfig.TAG_DPOST_TITLE);
                newsTitle.setText(title);

                JSONObject pOrigin = jsonObject.getJSONObject("cat");
                String origin = pOrigin.getString("origin");
                newsOrigin.setText(origin);


                String content = jsonObject.getString(DetailConfig.TAG_DPOST_CONTENT);
                newsContent.setText(content);


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

The things I know

  1. In logcat, loadNews method is called.
  2. I'm logging Volley, and from logcat volley is not complaining in anyway
  3. I can't see "onResponse called NewsDetails" in logcat, meaning that for some reason not known to me, it's not called

So, my question is why is onResponse not called and how should I fix it?


回答1:


/* you are getting json in response but your response listener method is get Json Array replace your code with below code and also add an debug point in your error listener method */

 private void loadNews() {
        Log.d(TAG, "loadNews called");

        mProgresscircle = new ProgressDialog(NewsDetails.this);
        mProgresscircle.setCancelable(false);
        mProgresscircle.setMessage(null);
        mProgresscircle.show();


        int news_id = getIntent().getIntExtra("NewsId", -1);
        Toast.makeText(NewsDetails.this, "News id is" + news_id, Toast.LENGTH_SHORT).show();

        final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                    DetailConfig.GET_DURL, requestParam,
                    new Response.Listener<JSONObject>() {

                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("Debug", response.toString());
                            //TODO parsing code
                            parseNews(response);
                        }
                    }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("", "Error: " + error.getMessage());

                }
            });
        //Creating request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to queue
        requestQueue.add(djsonArrayRequest);
    }




// or replace this code into your into your loadNews method

 final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                    DetailConfig.GET_DURL, requestParam,
                    new Response.Listener<JSONObject>() {

                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("Debug", response.toString());
                            //TODO parsing code
                            parseNews(response);
                        }
                    }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("", "Error: " + error.getMessage());

                }
            });

**

You can also refer below link for complete tutorial http://www.hackpundit.com/android-turorial-json-parse-volley/

**




回答2:


You should use JsonObjectRequest instead of JsonArrayRequest because you are getting jsonobject in the response. For getting more knowledge you may go through Volley tutorial



来源:https://stackoverflow.com/questions/36614675/why-is-volleys-onresponse-not-called

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!