我试图在这里创建一个列表,但问题是在我使用信息填充数组daysList之后,在退出onResponse之后一切都会丢失。
如果我在onResponse方法中设置textview它可以工作,但如果我在外面做(如本例),它就不会,我得到空指针异常。
我知道我必须将数组定义为静态以保存数据,但它也不起作用!我该如何解决这个问题?
public class MainFragment extends Fragment {
private View view;
private RequestQueue requestQueue;
private WeatherAdapter weatherAdapter;
public static WeatherForecast weatherForecast;
public static WeatherForecast.List[] daysList;
private ListView listView;
private TextView textView;
String URL = "requestURL";
public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
public View onCreateView ( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
view = inflater.inflate(R.layout.main_fragment,null);
textView = (TextView) view.findViewById(R.id.textview);
requestQueue = Volley.newRequestQueue(getActivity());
JsonObjectRequest jsonWeatherRequest = new JsonObjectRequest(
URL,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
weatherForecast = parseWeatherToJson(response.toString());
daysList = weatherForecast.getList();
//textView.setText("Humidity is: " + daysList[0].getHumidity()); <--- If i set it here it works!
weatherAdapter.notifyDataSetChanged();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.v(TAG, "On Error!");
}
}
);
requestQueue.add(jsonWeatherRequest);
textView.setText("Humidity is: " + daysList[0].getHumidity()); // <---- This throws nullpointer.
}
答案 0 :(得分:1)
如果我在onResponse方法中设置textview它可以工作,但是如果我在外面做的话就不行
Net请求是一个异步操作,因此您必须在回调对象的方法中编写所有逻辑。这就是为什么你在回调对象中有数据的原因,但是你没有他们的数据。
答案 1 :(得分:1)
apply()
是异步请求,它会命中服务器并在jsonWeatherRequest
回调中获取响应。当您使用onResponse()
之外的列表值设置TextView
时,您的请求未完成,因此您的列表为空。
因此,如果您想访问该列表,则必须在onResponse()
回调中执行此操作。
答案 2 :(得分:0)
有没有办法在onResponse方法之外使用数组信息?
是的。当然有。
但你需要等待响应首先完成!!
这就是您的代码中缺少的内容。
本Q&amp; A解释了如何等待Volley请求完成:
但请注意如果您在错误的地方等待,则可能会锁定您应用的用户界面。