【问题标题】:Cannot get json data properly无法正确获取json数据
【发布时间】:2017-05-06 07:51:22
【问题描述】:

我正在使用 android volley 从我的远程 mysql 数据库中访问我的 json 数据。大多数时候它没有得到任何数据,它总是进入 response.errorlistener 部分,但有时它工作正常。请告诉我访问网络服务最有效的方式是什么。

05-06 13:18:49.055 18409-18409/com.goworks.readyworks D/CubicBezierInterpolator: CubicBezierInterpolator mControlPoint1x = 0.2, mControlPoint1y = 0.65, mControlPoint2x = 0.28, mControlPoint2y = 0.97 05-06 13:18:49.055 18409-18409/com.goworks.readyworks D/CubicBezierInterpolator: CubicBezierInterpolator mControlPoint1x = 0.2, mControlPoint1y = 0.65, mControlPoint2x = 0.28, mControlPoint2y = 0.97 05-06 13:18:49.055 18409-18409/com.goworks.readyworks D/CubicBezierInterpolator: CubicBezierInterpolator mControlPoint1x = 0.2, mControlPoint1y = 0.65, mControlPoint2x = 0.28, mControlPoint2y = 0.97 05-06 13:18:49.055 18409-18409/com.goworks.readyworks D/CubicBezierInterpolator: CubicBezierInterpolator mControlPoint1x = 0.2,mControlPoint1y = 0.65,mControlPoint2x = 0.28,mControlPoint2y = 0.97 05-06 13:18:49.085 18409-18805/com.goworks.readyworks E/Volley:[569] NetworkDispatcher.run:未处理的异常 java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare() java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare() 在 android.os.Handler.(Handler.java:200) 在 android.os.Handler.(Handler.java:114) 在 android.widget.Toast$TN.(Toast.java:342) 在 android.widget.Toast.(Toast.java:99) 在 android.widget.Toast.makeText(Toast.java:248) 在 com.goworks.readyworks.RegisterActivity$5.getParams(RegisterActivity.java:314) 在 com.android.volley.Request.getBody(Request.java:468) 在 com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:253) 在 com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:227) 在 com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107) 在 com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:97) 在 com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114) 05-06 13:18:49.235 18409-18409/com.goworks.readyworks E/注册错误:: com.android.volley.VolleyError: java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare()

if (isValidated()) {

            pDialog = new ProgressDialog(RegisterActivity.this);
            pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            pDialog.setTitle("Making a member");
            pDialog.setMessage("Please Wait...");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(true);
            pDialog.show();

            userUsername = uname.getText().toString();
            userPassword = pass.getText().toString();
            emailAddress = email.getText().toString();
            userAddress = address.getText().toString();
            userContact = contact.getText().toString();

            StringRequest stringrequest = new StringRequest(Request.Method.POST, url + "registration.php",
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {

                                JSONArray jsonArray = new JSONArray(response);
                                JSONObject jsonObject = jsonArray.getJSONObject(0);
                                String code = jsonObject.getString("code");
                                String message = jsonObject.getString("message");

                                if (code.equals("reg_success")) {
                                    Toast.makeText(RegisterActivity.this, message, Toast.LENGTH_SHORT).show();
                                    pDialog.cancel();
                                    Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                    startActivity(intent);
                                    finish();

                                } else if (code.equals("reg_failed")) {
//                                    Snackbar.make(v, message, Snackbar.LENGTH_LONG).setAction("Action", null).show();
                                    pDialog.cancel();
                                    Toast.makeText(getApplicationContext(),"Not Registered",Toast.LENGTH_SHORT).show();

                                }


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

                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                            Toast.makeText(getApplicationContext(), "Something went wrong, Please try again", Toast.LENGTH_SHORT).show();
//                    Snackbar.make(v, "Something went wrong, Please try again", Snackbar.LENGTH_LONG).setAction("Action", null).show();
                    pDialog.cancel();
                    Log.e("Registration Error:", String.valueOf(error));
                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();

                    params.put("username", userUsername);
                    params.put("password", userPassword);
                    params.put("email", emailAddress);
                    params.put("contact", userContact);
                    params.put("address", userAddress);
                    params.put("location", finalCoords);

                    Toast.makeText(getApplicationContext(), "Data Delievered", Toast.LENGTH_SHORT).show();

                    return params;
                }
            };

            RequestQueue requestQueue = Volley.newRequestQueue(RegisterActivity.this);
            requestQueue.add(stringrequest);
        }

【问题讨论】:

  • 显示代码并分享logcat
  • 问题是你的远程mysql数据库。
  • 它只在注册部分给出问题。在登录部分和其他方面它工作得很好。
  • 首先检查网络连接,第二次检查URL,第三次检查参数必须相同,并且不能在参数中附加空值。希望对你有帮助
  • 去掉` throws AuthFailureError `试试看。

标签: android web-services api


【解决方案1】:

首先通过在onErrorResponse(..){中添加以下代码来检查是什么错误

if (error instanceof TimeoutError) {
Toast.makeText(context,"TimeoutError",Toast.LENGTH_SHORT).show();
} else if (error instanceof NoConnectionError) {
    Toast.makeText(context,"NoConnectionError",Toast.LENGTH_SHORT).show();
} else if (error instanceof AuthFailureError) {
    Toast.makeText(context,"AuthFailureError",Toast.LENGTH_SHORT).show();
} else if (error instanceof ServerError) {
    Toast.makeText(context,"ServerError",Toast.LENGTH_SHORT).show();
} else if (error instanceof NetworkError) {
    Toast.makeText(context,"NetworkError",Toast.LENGTH_SHORT).show();
} else if (error instanceof ParseError) {
    Toast.makeText(context,"ParseError",Toast.LENGTH_SHORT).show();
}

【讨论】:

  • 什么是响应字符串?
  • 试试这行错误你得到了什么? Toast.makeText(context,error.getMessage(),Toast.LENGTH_SHORT).show();
  • java,lang.RuntimeException: Cant 在未调用 Looper.prepare() 的线程内创建处理程序`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多