毕设的某个fragment需要取得数据库里的一个表的数据,通过服务器端将这些数据转成JsonArray传到了Android端。但是却解析失败了,弄了几个小时才发现是Json.get()方法内的参数名写错了,当时真的想锤人。
这里给大家提个醒,千万注意这些细节,不要因为一时图快而让后面多花很多时间。
好不容易把数据转成类数组list了(list的size是10),但是在使用这个list内的数据时又获取不到了,没办法只好在fragment内部添加log日志看看到底出了什么问题。
代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView"); //log
getClassRoom();
StatusBarUtils.setWindowStatusBarColor(getActivity());
StatusBarUtils.setAndroidNativeLightStatusBar(getActivity());
return inflater.inflate(R.layout.frag_1, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated "+list.size()); //log
...
checkBookable(R.id.class_06);
...
}
public void checkBookable(int id) {
int i = 0;
ImageButton button;
button = getActivity().findViewById(id);
int number = floor * 100 + Integer.valueOf(button.getContentDescription().toString());
Log.d(TAG, number + " " + list.size() + ""); //log
while (i < list.size()) {
if (list.get(i).getClassNumber() == number && !list.get(i).isBookable()) {
button.setImageResource(R.drawable.icons8_class_50);
button.setEnabled(false);
}
i++;
}
}
public void getClassRoom() {
String url = "http://192.168.1.6:8080/GraduationDesign/Graduation/getClassroom";
HttpUtil.get(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
if (statusCode == 200) {
list = analyseString.analyseClassData(response.toString());
Log.d(TAG, "getClassroom "+list.size()); //log
}
}
});
}
然后运行项目,查看logcat,发现了奇怪的事情。
可以看到,首先执行了onCreateView()方法,然后执行了onActivityCreated()方法。进入onActivityCreated()方法时list的size还是0,并没有在getClassroom()方法内赋值。接着是checkBookable()方法内部的log,由于没有进行赋值,当然size还是0。最后才是本应该在进入onActivityCreated()方法前就被执行的getClassroom()方法,完成了对list的赋值,使得list的size变成了10。
为什么会这样,我有一个猜想,不知道对不对:由于getClassroom需要对服务器进行一个请求,然后等待response到达。这个等待的时间可能比系统执行其他语句的时间要久。所以导致了应该先执行的语句却后执行了。
问题找到了,怎么解决呢。
很简单,之所以在onActivityCreated()方法而不是onCreateView()方法内使用checkBookable()方法,是为了获取当前活动(而onCreateView方法执行时并没有Activity)从而绑定组件。既然getClassroom在onActivityCreated()执行完后(严格来说是组建完成绑定后)再执行的,此时的Activity应该已经创建好了,所以在getClassroom()方法内执行checkBookable()方法即可。