从 JSON Volley 请求中获取值的正确方法是什么?

What is a proper way of getting values from a JSON Volley requset?

我有一个 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() 方法 returns 我希望在 onCreateView() 中使用 ArrayList,那么做这件事的正确方法是什么?

I know its ok, i must handle everithing inside onSuccess inner class, is there some way of getting values to onCreateView? – Zoltan Kurtyak

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

这里的问题是,一个请求需要花费未知的时间来 return 一个响应,所以 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);
        ...
    }