1

I wonder what is the correct pattern in android to show user data from database and in the meantime download data from server. Because users hate waiting for content in application i have to prioritize Database Fetcher, but i suppose there may be problems with synchronization in data (older data can replacing new).

My current code:

    public class MyDataFragment extends Fragment implements LoaderManager.LoaderCallbacks<Object> {
        private final static int LOADER_DOWNLOAD = 0x02;
        private final static int LOADER_DATABASE = 0x03; 
        private SampleAdapter adapter;
        private MainActivity mActivity;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = (MainActivity) activity;
    } 

    public Context getContext() {
        if (mActivity != null) {
            return mActivity.getApplicationContext();
        }
        return null;
    }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            adapter = new SampleAdapter();
            getLoaderManager().restartLoader(LOADER_DATABASE, null, this);
            getLoaderManager().restartLoader(LOADER_DOWNLOAD, null, this);

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.profile_fragment, container, false);
    // create listview and connect to adapter
            return v;
        }

        @Override
        public Loader<Object> onCreateLoader(int id, Bundle args) {
            switch (id) {
                case LOADER_DATABASE:
                    return new DataLoaderFromDatabase(getContext());
                case LOADER_DOWNLOAD:
                    return new DataLoaderFromRequest(getContext());
            }
            return null;
        }

        @Override
        public void onLoadFinished(Loader<Object> loader, Object data) {
            List<Object> myObjectList = (List) data;
            switch (loader.getId()) {
                case LOADER_DOWNLOAD:
                    if (myObjectList.isEmpty()) {
                        showError();
                    } else {
                        adapter.setData(myObjectList);
                    }
                    break;
                case LOADER_DATABASE:
                    if (!myObjectList.isEmpty()) {
                        adapter.setData(myObjectList);
                    }
                    break;
            }
        }

        private void showError() {
            Toast.makeText(getContext(), "Connection problem", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLoaderReset(Loader<Object> loader) {

        }

        public static class DataLoaderFromRequest extends BetterLoader {

            public DataLoaderFromRequest(Context ctx) {
                super(ctx);
            }

            @Override
            public Object load() {
               RestClient restClient = new RestClient();
//Send request to database
                Response response = restClient.sendRequestForData();
                if (response.isSucceed()) { 
                    return response.getData();
                } else {
                    return Collections.emptyList();
                }
            }
        }


        public static class DataLoaderFromDatabase extends BetterLoader {

            public DataLoaderFromDatabase(Context ctx) {
                super(ctx);
            }

            @Override
            public Object load() {
//get data from Database
                return new Select().all().from(MyModelData.class).queryList();
            }
        }
    }
Shu
  • 11
  • 2

0 Answers0