从JSON Volley requset获取值的正确方法是什么?

时间:2015-07-08 00:18:12

标签: java android android-volley inner-classes

我有一个看起来像这样的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()内使用的git push,那么正确的方法是什么做这件事?

1 个答案:

答案 0 :(得分: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);
        ...
    }