从 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);
...
}
我有一个 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);
...
}