我使用Google Places API开发了AutoCompleteTextView。当用户输入地址时,我正在对API进行网络调用。我尝试模拟崩溃,但在我能够更改配置之前请求已完成。
public class PlacesAutoCompleteAdapter extends ArrayAdapter<Prediction> implements Filterable {
private List<Prediction> resultList;
public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public int getCount() {
return resultList.size();
}
@Override
public Prediction getItem(int index) {
return resultList.get(index);
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
ShlepenApp.getGoogleRestClient().getPlaceList(GoogleService.API_KEY, constraint.toString(), new Callback<GooglePlacesListResponse>() {
@Override
public void success(GooglePlacesListResponse placesListResponse, Response response) {
Log.i("TAGE", "SUCCESS");
resultList = placesListResponse.getPredictions();
notifyDataSetChanged();
}
@Override
public void failure(RetrofitError error) {
Log.i("TAGE", "FAILURE");
//TODO: Post something useful here.
}
});
// Assign the data to the FilterResults
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}};
return filter;
}
}
编辑:你能详细说明我在旋转设备时在网络通话中发生了什么吗?此调用是否会丢失,然后重新创建,因为自动文本视图中存在字母?
答案 0 :(得分:2)
请详细说明网络通话期间实际发生的情况 当我旋转设备?此调用是否会丢失,然后重新创建 因为字母存在于autotextview中?
我没有与Google Places API
合作,但我认为这可能会对您有所帮助:
当你旋转你的设备时,你的活动被杀死了你的适配器,但正在进行网络操作的线程存在并正在完成它的工作。完成它的工作后,它将告诉你结果(调用回调失败或成功之一),但没有适配器,因为旧的是垃圾收集,线程无法访问新的适配器,所以它正在调用回调方法,在每个方法中,它将访问空对象(private List<Prediction> resultList;)
。
答案 1 :(得分:1)
根据文档,方法Filter.performFiltering()
在工作线程中调用,因此您不会通过在此方法中执行IO操作来阻止UI。