【问题标题】:What is a proper way of getting values from a JSON Volley requset?从 JSON Volley 请求中获取值的正确方法是什么?
【发布时间】:2015-07-08 00:18:12
【问题描述】:

我有一个如下所示的 JSON 请求:

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
        url,
        (String) null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                roomArray = parseRoomsResponse(response);
                callback.onSuccess(roomArray);
            }
        }, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {

    }
}

这个请求在onCreateView() 方法中,我的parseRoomsResponse() 方法返回一个ArrayList,我希望在onCreateView() 中使用它,那么做这件事的正确方法是什么?

【问题讨论】:

  • 是的,我觉得还可以。这就是我通常的做法。
  • 我知道没关系,我必须处理 onSuccess 内部类中的所有内容,有什么方法可以获取 onCreateView 的值吗?
  • 没有。这就是异步的意思。

标签: java android android-volley inner-classes


【解决方案1】:

我知道没关系,我必须处理 onSuccess 内部类中的所有内容, 有什么方法可以获取 onCreateView 的值吗? – Zoltan Kurtyak

啊..我看到你现在的问题了。

这里的问题是,请求需要未知的时间来返回响应,因此 Volley 会为您异步生成这些请求,而不是锁定您的 UI 线程。
因此,如果您在onCreateView 中提出请求,那么当您收到回复时,您不太可能还在onCreateView 中。

您可能需要重新考虑代码流程。如果您的片段视图依赖于请求的响应,那么您可能应该确保在创建片段视图之前执行请求并获取响应。


解决此问题的典型方法是在收到响应之前使用占位符值。例如:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_layout, container, false);
    ...
    EditText myEditText = (EditText) rootView.findViewById(R.id.response_dependent_edittext);
    myEditText.setText("Loading Data");

    ImageView myImageView = (ImageView) rootView.findViewById(R.id.response_dependent_imageview);
    myImageView.setImageResource(R.drawable.image_placeholder);
    ...

    return rootView;
}

然后你可以创建一个 updateViews 方法;

private void updateViews(ArrayList<MyArrayType> myParsedArray) {

    // Extract relevant data from the array
    ...

    // Replace the place holders in the relevant views
    EditText myEditText = (EditText) getView().findViewById(R.id.response_dependent_edittext);
    myEditText.setText(stringFromParsedArray);

    ImageView myImageView = (ImageView) getView().findViewById(R.id.response_dependent_imageview);
    myImageView.setImageDrawable(drawableFromParsedArray);

}

并从您请求的 onResponse 方法中调用它:

@Override
    public void onResponse(JSONObject response) {
        myParsedArray = parseResponse(response);
        updateViews(myParsedResponse);
        ...
    }

【讨论】:

  • 我可以让我的程序在继续之前等待响应吗,这对我来说没问题,或者我必须使用 onSuccess 来解决这个问题?
  • 非常感谢,你帮助了我,你最好的:)
  • 很高兴它对您有所帮助。如果答案解决了您的问题,请记得将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多