在Android中加载页面时如何设置值?

时间:2019-03-29 10:36:27

标签: android json android-volley

我正在创建一个android应用程序,却一无所获。我正在调用Web服务并获得一个JSON值。然后,将该值设置为TextView字段。但是我面临的问题是,在加载页面时,将值设置为TextView的时机已经晚了。有时,该值未设置为该TextView。因此,在继续执行其他功能之前,我必须进行检查,如果未设置该值,请再次调用以下方法。

  

调用Web服务并获取值并将文本设置为   TextValue

private void getJsonRequest() {
    String tag_string_req = "req_data";

    request = new StringRequest(Request.Method.POST, "URL", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonObject = new JSONObject(response);
                if (jsonObject.names().get(0).equals("res")) {

                    JSONArray array = jsonObject.getJSONArray("res");
                    JSONObject obj = array.getJSONObject(0);
                    String value = obj.getString("value");

                    spin.setText(value);
                } else {
                    Toast.makeText(getApplicationContext(), "No Value Available", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            hashMap = new HashMap<String, String>();
            hashMap.put("uid", userID);
            return hashMap;
        }
    };
    request.setRetryPolicy(new DefaultRetryPolicy(15 * 1000, 1,
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    AppController.getInstance().addToRequestQueue(request, tag_string_req);
}

然后我在onCreate()内部调用了该方法。

protected void onCreate(Bundle savedInstanceState) {
   //There are more codes,
   getJsonRequest();
}

因此,我需要在页面加载时设置该值。在看到该页面之前,必须先设置该值。我怎样才能做到这一点?有人可以帮助我吗?预先感谢。

3 个答案:

答案 0 :(得分:3)

private void getJsonRequest() {
String tag_string_req = "req_data";

request = new StringRequest(Request.Method.POST, "URL", new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
      progressDialog.dismiss();
        try {
            JSONObject jsonObject = new JSONObject(response);
            if (jsonObject.names().get(0).equals("res")) {

                JSONArray array = jsonObject.getJSONArray("res");
                JSONObject obj = array.getJSONObject(0);
                String value = obj.getString("value");

                spin.setText(value);
            } else {
                Toast.makeText(getApplicationContext(), "No Value Available", Toast.LENGTH_SHORT).show();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        progressDialog.dismiss();
        error.printStackTrace();
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        hashMap = new HashMap<String, String>();
        hashMap.put("uid", userID);
        return hashMap;
    }
};
request.setRetryPolicy(new DefaultRetryPolicy(15 * 1000, 1,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Fetching The File....");
progressDialog.show();
AppController.getInstance().addToRequestQueue(request, tag_string_req);
}

答案 1 :(得分:2)

您可以创建一个progress dialog来向用户显示您正在获取数据

  //initialize the progress dialog and show it
  progressDialog = new ProgressDialog(getActivity());
  progressDialog.setMessage("Getting data..");
  progressDialog.show();

这将在发送request

之前

然后在onResponse中将文本设置为您称之为的

  progressDialog.dismiss();

您还应该关闭onErrorResponse中的进度对话框

编辑:

如果您应该等待返回的JSON的值,因为在进一步的实现中将使用该值,则可以为此设置一个boolean标志

  private boolean mHasReceivedData = false;

然后在onCreate方法中,您将其更改为

  protected void onCreate(Bundle savedInstanceState) {
   //There are more codes,
   getJsonRequest();

   if(mHasReceivedData){
    //here you use the returned data.

} }

然后在请求成功中添加此行

  mHasReceivedData = true;

这样,您可以确保在使用返回的JSON之前已设置其值,因此不会有空的textView。

答案 2 :(得分:0)

我建议的最简单的解决方案是创建一个对象并在其上同步,这将确保在用户看到页面之前已设置textview,但这不是一个好习惯。