Sign navigation box to observable

I want to fill out the navigation box by subscribing to Observable , which receives data from db and, when done, notifies the subscriber (using RxJava ). I did something similar with Subscriber , which is a class that extends Fragment , but it differs in that the navigation box is not a separate fragment, but rather defined in MainActivity.

How can I sign up for Navigation Drawer at Observable ?

MainActivity.java

 private DrawerLayout mDrawerLayout; private ListView mDrawerList; @Override public void onStart() { mLoadAndStoreDataObservable = Observable.create( super.onStart(); new Observable.OnSubscribe<String>() { // fragment creation code was here // populates a String[] myStringArray for Navigation Drawer permitsSQLiteManager.addLogLine(mActivity, logString); if (!skipRestfulServiceCall) { getDataFromRestfulService(); } } catch (Exception e) { else { // get data from SQLite Log.e("loadAndStoreData ", "Exception: " + e.getMessage()); getDataFromSQLite(); mProgressDialog.dismiss(); } } } mTitle = mDrawerTitle = getTitle(); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); .subscribeOn(Schedulers.io()) mDrawerList = (ListView) findViewById(R.id.left_drawer); .observeOn(AndroidSchedulers.mainThread()) .subscribe(mDrawerLayout); // parameter was a Fragment mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, myStringArray)); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); // enable ActionBar app icon to behave as action to toggle nav drawer getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open,R.string.drawer_close ) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } private void getDataFromRestfulService() { <get data> // implement RxJava-Observable/Subscriber mLoadAndStoreDataObservable = Observable.create( new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try { Utilities.loadAndStoreData(mActivity); subscriber.onNext("Utilities.loadAndStoreData Done"); //subscriber.onCompleted(); Log.e("MainActivity.onCreate()", "subscriber.onNext(\"Utilities.loadAndStoreData Done\")"); String logString = "MainActivity.onCreate() - subscriber.onNext(Utilities.loadAndStoreData Done)"; Log.e(TAG, logString); PermitsSQLiteManager permitsSQLiteManager = PermitsSQLiteManager.getInstance(); permitsSQLiteManager.addLogLine(mActivity, logString); mProgressDialog.dismiss(); } catch (Exception e) { Log.e("loadAndStoreData ", "Exception: " + e.getMessage()); subscriber.onError(e); mProgressDialog.dismiss(); } } } ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mDrawerLayout); // compile error // suscriber was a Fragment, but no longer } 
+7
android rx-java observable navigation-drawer
source share
2 answers

if mDrawerLayout is an instance of a class that implements Observer , than you can apply it to Observer

 NavigationDrawer mDrawerLayout = ... yourObservable.subscribe((Observer)mDrawerLayout); 

if it does not implement the Observer interface, then you can create a new Observer that will manage your navigation box. (Maybe you need to declare mDrawerLayout final)

 final NavigationDrawer mDrawerLayout = ... yourObservable.subscribe(new Observer<String>() { @Override public void onCompleted() { // on completed } @Override public void onError(Throwable throwable) { // on error } @Override public void onNext(String people) { mDrawerLayout.doSomething(); } }); 
+2
source share

Suppose you want to receive updates from the News.java class.

So you implement the Observer interface from your news class

 News implements Observable{ public void publishNews(){ String newNews = "newNews"; //Now notify Users that new news is available by calling the following // two methods setChanged(); notifyObservers(); // This will call the subscribers and notify them // that there is a change. } } 

Now you want the user to receive updates.

 public class User implements Observer(){ } 

Add this to any class in which you create user class variables. This code ensures that the objects user1, user2 are "signed" in the "News Class"

 News news = new News(); User user1 = new User(); User user2 = new User(); news.add(user1); // You have to instantiate News object to user the add method news.add(user2); // from Observable interface. 

Add logic when something updates. The update () method is provided by the Observer interface.

 @Overrride public void update(Observable, Object){ // This gets called after notifyObservers() in the Observable class // Whatever you want to do after Observable calls notifyObservers, goes here } 
+2
source share

All Articles