这是Activity代码:
private ListView listView;
private List<User.UserMess> list=new ArrayList<User.UserMess>();
public GetDataFromInternet getData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData=new GetDataFromInternet(GlobalContants.USER_URL);
getData.getData(GlobalContants.USER_URL);
list=getData.getUserlist();
listView= (ListView) findViewById(R.id.list_test);
if(list!=null){
System.out.println(list.size());
listView.setAdapter(new AdapterList(this,list));
}
else {
System.out.println("error");
}
}
定义的获取网络数据的类:
public class GetDataFromInternet {
private String murl;
User user;
public ArrayList<User.UserMess> userlist=new ArrayList< User.UserMess>();
public GetDataFromInternet(String url){
this.murl=url;
}
public void getData(String url) {
HttpUtils uitls=new HttpUtils();
uitls.send(HttpMethod.GET, url, new RequestCallBack<String>() {
public void onSuccess(ResponseInfo responseInfo){
String result= (String) responseInfo.result;
if(result!=null){
System.out.println("GetDateFromInternet:从网络获取数据");
parseDataTest(result);
}
}
public void onFailure(com.lidroid.xutils.exception.HttpException error, String msg) {
System.out.println("获取数据失败");
}
});
}
public void parseDataTest(String result) {
Gson gson=new Gson();
user=gson.fromJson(result,User.class);
if(user!=null){
this.userlist=user.data;
System.out.println("GetDateFromIntent解析成功");
}
}
public ArrayList<User.UserMess> getUserlist() {
return userlist;
}
我的问题是在Activity里初始化时,先执行了
System.out.println(list.size());
这句测试代码,之后再完成了数据解析,导致我没获取到想拿的数据,最后执行结果控制台打印顺序为
I/System.out: 0
I/System.out: GetDateFromInternet:从网络获取数据
I/System.out: GetDateFromIntent解析成功
uitls.send(HttpMethod.GET, url, new RequestCallBack()
关键是这个,这里是伊布执行的,也就是先调用send下面的代码。什么时候收到返回的数据,什么时候执行RequestCallBack定义的回调函数,因为网络延迟不同,所以什么时候调用不确定。
同意上楼,Activity代码你应该在getData.getData代码块有个耗时机制,不要在主UI线程里,得到数据后再传给list。另外你的list恒!=null,List泛类去多看看吧。