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();
}
}
}