为什么Volley的onResponse没有被称为

时间:2016-04-14 05:42:28

标签: android android-volley

我通过Volley获取json数据。我遇到的问题  是从未调用过Volley的onResponse,因此不会解析和显示数据。

示例JSON数据

{
   "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();
            }
        }
    }
}

我知道的事情

  1. 在logcat中,调用loadNews方法。
  2. 我正在记录Volley,而且从logcat凌空开始并没有抱怨
  3. 我在logcat中看不到“onResponse called NewsDetails”,这意味着由于某些原因我不知道,它不被称为
  4. 所以,我的问题是为什么onResponse没有被调用,我应该如何解决它?

2 个答案:

答案 0 :(得分:4)

您应该使用 JsonObjectRequest 而不是JsonArrayRequest,因为您在响应中获得了jsonobject。 要获得更多知识,您可以通过Volley tutorial

答案 1 :(得分:3)

/ *你得到了json的响应,但你的响应监听器方法是让Json Array用下面的代码替换你的代码,并在你的错误监听器方法中添加一个调试点* /

 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());

                }
            });

**

您还可以参考以下链接获取完整教程http://www.hackpundit.com/android-turorial-json-parse-volley/

**