在Fragment中使用web服务调用,如何消除GridView列表显示的延迟



我构建了一个片段,它使用web服务调用中的数据来显示gridView列表。它有大约0.5秒的延迟来实际抓取数据并在xml上显示gridView。问题是每次我从其他页面返回或重新定向视图时,都会发生延迟。我不知道我错过了什么,但系统应该保存在内存中的最后一个视图显示之前,它从web服务得到真实的数据,每当我从其他页面回来?

public class fragment_grid_room extends Fragment{
    private static final String TAG = fragment_grid_room.class.getName();
    public fragment_grid_room() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Add this line in order for this fragment to handle menu events.
        setRetainInstance(true);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //start async task to display rooms
        DisplayGridRooms gridRooms = new DisplayGridRooms();
        gridRooms.execute(new String[] { "params" });
        View rootView = inflater.inflate(R.layout.fragment_roomgrid, container, false);
        //rootView.findViewById(R.id.loadingPanel).setVisibility(View.VISIBLE);
        //add current date
        TextView dayTV = (TextView) rootView.findViewById(R.id.currentDate);
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy");
        Date now = new Date();
        String strDate = sdf.format(now);
        Log.d(TAG, "*****strdate"+strDate);
        dayTV.setText(strDate);
        return rootView;
    }


    //async task to display rooms
    private class DisplayGridRooms extends AsyncTask<String, Void, JSONArray> {
        JSONArray jsonArrayRooms;
        @Override
        protected JSONArray doInBackground(String... url) {
            String email = getResources().getString(R.string.temp_login);
            String pwd = getResources().getString(R.string.temp_pwd);
            String username = "apark@anexinet.com";
            webServiceRoom wsRoom = new webServiceRoom();
            jsonArrayRooms = wsRoom.getRoomList(email, pwd, username);
            //System.out.println("222******returning jsonroom with: "+jsonRoom.length());
            return jsonArrayRooms;
        }
        @Override
        protected void onPostExecute(JSONArray jsonArrayRooms) {
            ArrayList<roomGrid> room_list = new ArrayList<roomGrid>();
            int totalNumRooms=jsonArrayRooms.length();
            int availNum=0;
            for (int i = 0; i < jsonArrayRooms.length(); i++) {
                roomGrid roomObject = new roomGrid();
                try {
                    JSONObject jsonRoom = jsonArrayRooms.getJSONObject(i);
                    String[] temp = jsonRoom.getString("roomName").split("-");
                    String[] temp2 = temp[1].split("\(");
                    roomObject.setRoomName(temp2[0].trim());
                    String roomStat = jsonRoom.getString("statusText");
                    roomObject.setStatus(roomStat);
                    room_list.add(roomObject);
                    if(roomStat.toLowerCase().contains("available")){ //count available rooms
                        availNum+=1;
                    };
                } catch (Exception ex) {
                    Log.e(TAG, "json array exception for rooms:" + ex);
                }
            }
            final GridView gridView = (GridView) getActivity().findViewById(R.id.gridview_room);
            //set availability bar
            TextView avalBar = (TextView) getActivity().findViewById(R.id.availableBar);
            String availbilityText = "Available "+availNum+" of "+totalNumRooms;
            avalBar.setText(availbilityText);
            Window window = getActivity().getWindow();
            View v = window.getDecorView();
            ImageButton imageGrid = (ImageButton) v.findViewById(R.id.gridButton);
            imageGrid.setVisibility(View.GONE);
            Display display = getActivity().getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            int height = size.y;
            int numColFinal = 1;
            if (width > 350) {
                double numCol = width / 350;
                numColFinal = (int) numCol;
            }
            gridView.setNumColumns(numColFinal);
            Log.d(TAG, "screen width, numColFinal=" + width + "," + numColFinal);

          //  getActivity().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
            gridView.setAdapter(new CustomAdaptorRoomGrid(getActivity(), room_list));
            //when list is clicked, move to detail page
            gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                    Object o = gridView.getItemAtPosition(position);
                    roomGrid fullObject = (roomGrid)o;
                    String roomName = fullObject.getRoomName();
                    Intent intent = new Intent(getActivity(), RoomTimeslotActivity.class)
                            .putExtra(Intent.EXTRA_TEXT, roomName);
                    startActivity(intent);
                }

            });
        }
    }

}

解决这个问题的一种方法是在每次关闭片段时将数据存储在共享首选项中。

首先有一点改善。您可以将下面的代码从onPostExecute()移动到doInBackground()。然后不是返回onPostExecute()中的JSONArray而是返回roomGrid的列表

List<roomGrid> room_list = new ArrayList<roomGrid>();
int totalNumRooms=jsonArrayRooms.length();
int availNum=0;
for (int i = 0; i < jsonArrayRooms.length(); i++) {
    roomGrid roomObject = new roomGrid();
    try {
        JSONObject jsonRoom = jsonArrayRooms.getJSONObject(i);
        String[] temp = jsonRoom.getString("roomName").split("-");
        String[] temp2 = temp[1].split("\(");
        roomObject.setRoomName(temp2[0].trim());
        String roomStat = jsonRoom.getString("statusText");
        roomObject.setStatus(roomStat);
        room_list.add(roomObject);
        if(roomStat.toLowerCase().contains("available")){ 
            //count available rooms
            availNum+=1;
        };
    } 
    catch (Exception ex) {
        Log.e(TAG, "json array exception for rooms:" + ex);
    }
}

在你的类RoomGrid(你添加在你的列表)中,添加

  • 方法toJson() -它创建一个JSONObject实例表示您的数据
  • 静态方法public static RoomGrid from(JSONObject json) -这将创建并返回一个RoomGrid实例(或null,如果json是null,空等)

在你的CustomAdaptorRoomGrid添加- getItems(),它将返回创建适配器时提供的RoomGrid列表

在你的片段onDestroyView()添加:

CustomAdaptorRoomGrid adapter = (CustomAdaptorRoomGrid) gridView.getAdapter();
int length = adapter != null && adapter.getItems() != null ? adapter.getItems().size() : 0;
if (length > 0) {
    // create a JSONArray from the list
    JSONArray array = new JSONArray();
    for (RoomGrid item : adapter.getItems()) {
        array.put(item.toJson();
    }
    // add the value in preferences
    SharedPreferences prefs = ...;
    prefs.edit().put("YOUR_KEY", array.toString()).apply();
}

最后在您的片段onViewCreated()中检查来自共享首选项的数组,并将其还原为您的项目列表并将它们提供给适配器。

然后开始你的任务,下载和刷新你需要的东西。

最新更新