在 ArrayAdapter 中使网络调用安全吗?

max*_*max 5 java android android-adapter retrofit

我已经使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:您能否详细说明当我旋转设备时在网络通话期间实际发生的情况?这个调用会丢失,然后因为自动文本视图中存在字母而重新创建吗?

mml*_*loo 2

您能否详细说明当我旋转设备时网络通话期间实际发生的情况?此调用是否会丢失,然后由于自动文本视图中存在字母而重新创建?

我没有合作过 Google Places API,但我认为这可能对你有帮助:

当您旋转设备时,您的活动将被终止,并且您的适配器但正在执行网络操作的线程仍然存在并正在执行其工作。完成工作后,它将告诉您结果(调用回调失败或成功之一),但没有适配器,因为旧适配器已被垃圾收集,并且线程无法访问新适配器,因此它正在调用回调方法,并且在每个方法中它将访问空对象(private List<Prediction> resultList;)