【问题标题】:How to set a value when the page loads in Android?如何在 Android 中加载页面时设置一个值?
【发布时间】:2019-03-29 10:36:26
【问题描述】:

我正在创建一个 Android 应用程序,但我被困在某一点上,不知道该怎么做。我正在调用网络服务并获取 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();
}

所以我需要在页面加载时设置该值。在我看到必须设置值的页面之前。我怎样才能做到这一点?

【问题讨论】:

  • 保持 UI 会很糟糕,而是显示进度条来保持用户交互。
  • 有个东西叫ASYNC TASK
  • 如果有人能提供一些代码sn-p,我真的很感激?

标签: android json android-volley


【解决方案1】:
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);
}

【讨论】:

    【解决方案2】:

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

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

    这将在发送request之前进行

    然后在onResponse中设置textView中的文本后你调用这个

      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。

    【讨论】:

    • 页面加载时我不能这样做吗?页面加载完成时需要设置值。
    • 我没有得到你想要达到的目标?你能给我解释一下吗?
    • 当活动加载时,我需要将 JSON 值设置为文本字段。就像一个默认值。没有等待时间。我该怎么做?
    • 您不能这样做,因为等待时间取决于您的服务器延迟和互联网连接速度。因此,对于等待时间,您无能为力,但如果您需要 JSON 值来获得更多功能,并且您应该只在获得 JSON 值时执行这些功能,请告诉我,我有一个解决方案给您。
    • 不,它不会因为您的volley 请求已经是异步的。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2023-01-08
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多