Otto lanza "Objeto ya registrado" onResume en viewpager

Tengo 2 fragmentos en viewpager. Cuando la aplicación está en pausa (presione el botón de inicio, o debajo de otra aplicación) y luego se reanuda, otto tirar

E/stack: task on pause E/stack: note on pause E/stack: onPause E/stack: onResume E/stack: task on resume E/stack: note on resume E/AndroidRuntime: FATAL EXCEPTION: main E/AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {yarh.bigdig.bigdigtaskmanager/yarh.bigdig.bigdigtaskmanager.view.activity.SplashScreenActivity}: java.lang.IllegalArgumentException: Object already registered. E/AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575) E/AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603) E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Object already registered. E/AndroidRuntime: at com.squareup.otto.Bus.register(Bus.java:222) E/AndroidRuntime: at yarh.bigdig.bigdigtaskmanager.view.fragment.NoteListFragment.onResume(NoteListFragment.java:65) E/AndroidRuntime: at android.support.v4.app.Fragment.performResume(Fragment.java:2008) E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1119) E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1259) E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1241) E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:2063) E/AndroidRuntime: at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:187) E/AndroidRuntime: at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:462) E/AndroidRuntime: at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:451) E/AndroidRuntime: at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:141) E/AndroidRuntime: at android.app.Activity.performResume(Activity.java:5095) E/AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565) E/AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603) E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method) 

Fragmento PagerAdapter

 public class BodyHolderFragment extends Fragment{ @Bind(R.id.tabs) PagerSlidingTabStrip tabs; public @Bind(R.id.video_body_pager) ViewPager pager; public MyPagerAdapter pagerAdapter; @Override public View onCreateView( LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ){ View view = inflater.inflate(R.layout.fragment_body_holder, container, false); ButterKnife.bind(this, view); initPagerStrip(); return view; } @Override public void onDestroyView(){ super.onDestroyView(); ButterKnife.unbind(this); } public void initPagerStrip(){ String[] names = new String[]{getString(R.string.body_holder_tasks), getString(R.string.body_holder_notes)}; pagerAdapter = new MyPagerAdapter(getFragmentManager(), names); pager.setAdapter(pagerAdapter); final int pageMargin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics() ); pager.setPageMargin(pageMargin); pager.setPageMarginDrawable(R.color.overflowDialogDivider); tabs.setViewPager(pager); } public class MyPagerAdapter extends FragmentPagerAdapter{ private String[] pages; public MyPagerAdapter( FragmentManager fm, String[] pages ){ super(fm); this.pages = pages; } @Override public Fragment getItem(int position){ Bundle b = new Bundle(); Fragment f; switch(position){ case 0: f = new TaskListFragment(); f.setArguments(b); break; case 1: f = new NoteListFragment(); f.setArguments(b); break; default: f = new TaskListFragment(); f.setArguments(b); break; } return f; } @Override public int getCount(){ return 2; } @Override public CharSequence getPageTitle(int position){ return pages[position]; } } } 

y cada fragmento tiene

  @Override public void onPause() { super.onPause(); Log.e("stack", "note on pause"); BusProvider.getInstance().unregister(true); } @Override public void onResume() { super.onResume(); Log.e("stack", "note on resume"); getLoaderManager().initLoader(0, null, cursorLoader); BusProvider.getInstance().register(this); } 

5 Solutions collect form web for “Otto lanza "Objeto ya registrado" onResume en viewpager”

Tuve el mismo problema para los fragmentos dentro de la viewPager , mi solución es registrar el bus para el fragmento, que es actualmente visible, sólo sobrepasar setUserVisibleHint

 private boolean isRegistered = false; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (!isRegistered) { BusProvider.getInstance().register(this); isRegistered = !isRegistered; } } else { if (isRegistered) { BusProvider.getInstance().unregister(this); isRegistered = !isRegistered; } } } 

Registrar / cancelar el bus en onResume / onPause no debe causar esto, pero si alguien está buscando evitar esto en cualquier escenario, intente subclasificarlo.

 public class YourBus extends Bus{ private ArrayList registeredObjects = new ArrayList<>(); @Override public void register(Object object) { if (!registeredObjects.contains(object)) { registeredObjects.add(object); super.register(object); } } @Override public void unregister(Object object) { if (registeredObjects.contains(object)) { registeredObjects.remove(object); super.unregister(object); } } } 

Nota: Hacer esto ocultará error de programador como en cualquier caso de registrar / anular el registro este código no lanzará excepción.

Tuve una situación similar en la que me enfrentaba a fallos inconsistentes al registrar y anular el registro de Otto en varios fragmentos en un ViewPager y también deeplinking en pantallas de notificaciones push. No siempre están perfectamente emparejados. Tengo algunos servicios de fondo, etc que me registro normalmente, pero también quiero registrar el fragmento visible actual. Como sólo quería un registrado agregé este código a mi clase de contenedor de bus. No permitirá registros dobles (un).

 private Object currentScreen; public void registerCurrentScreen(Object object) { if (currentScreen != null) { bus.unregister(currentScreen); } currentScreen = object; bus.register(object); } public void unregisterCurrentScreen(Object object) { if (currentScreen != null) { bus.unregister(object); } currentScreen = null; } 

No ViewPager antes con ViewPager , pero Otto no permite registrar dos veces. Así que escribí banderas registradas y comprobar antes register() .
Es posible que sea mejor llamar a unregister() en Fragment#onDestroyView() también.

  private boolean isBusRegistered; protected void registerBus() { if (!isBusRegistered) { Log.v(TAG, "registerBus: " + this); BusProvider.getInstance().register(this); isBusRegistered = true; } } protected void unregisterBus() { if (isBusRegistered) { Log.v(TAG, "unregisterBus: " + this); BusProvider.getInstance().unregister(this); isBusRegistered = false; } } 

No se pudo solucionar ese problema. Cambiado a eventbus ya que no tiene ese problema.

  • ¿Cómo enviar un evento de Servicio a Actividad con el bus de eventos Otto?
  • ¿Hay ventajas para cambiar a Otto de Broadcast events
  • IllegalArgumentException cuando se utiliza Otto con un fragmento retenido
  • Está utilizando la biblioteca de eventos como Otto o EventBus como una forma recomendada de manejar las relaciones entre Actividades, Fragmentos y subprocesos de fondo
  • Cómo saber si un suscriptor de Otto está registrado
  • Reducción del número de clases de eventos al utilizar EventBus o Otto
  • Cancelar el registro de los oyentes en onDestroy - ¿cuál es el daño / pueden tener fugas?
  • Utilizar Otto para actualizar un listadapter de un GcmListenerService
  • NullPointerException con Otto y Dagger
  • ClassNotFoundException: No encontró la clase "android.os.PersistableBundle" Otto Android 5.0
  • @Subscribe método llamado tiempo múltiple para el mismo evento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.