GreenBroot EventBus no pudo enviar el evento
Estoy utilizando EventBus para comunicarse desde un hilo largo de ejecución a fragmentos que actualizar su interfaz de usuario. Este hilo de larga ejecución básicamente está escuchando la actividad de la red, analizándola y poniendo eventos en el bus. Tengo 2 fragmentos para recibir los eventos.
Estoy recibiendo un error cuando actualizo las interfaces de usuario de los fragmentos (una vista de texto) del método onEvent de los fragmentos. ¿Cómo puedo actualizar la interfaz de usuario en un fragmento de un hilo separado?
- Android: Sincronización con el subproceso de procesador de OpenGL
- IntentService y Threadpool
- Bloqueo de archivos a través de servicios
- ¿Puedo tener un ejemplo de mostrar un brindis usando runOnUiThread.
- ¿La declaración oneway en Android .aidl garantiza que el método será llamado en un hilo separado?
Aquí está mi código para los fragmentos y la salida logcat que estoy viendo …
Logcat:
10-15 02:19:44.637: I/System.out(682): debugger has settled (1440) 10-15 02:19:45.021: V/BRRT(682): start thread 10-15 02:19:45.021: V/BRRT(682): past start thread 10-15 02:19:45.031: V/TEST(682): running thread... 10-15 02:19:45.121: D/Event(682): No subscribers registered for event class com.broadreach.radiotester.io.ExpeditionEvent 10-15 02:19:45.121: D/Event(682): No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent 10-15 02:19:45.261: V/BRRT(682): OneUp event received: 204 : 32 10-15 02:19:45.271: W/ResourceType(682): No package identifier when getting value for resource number 0x00000000 10-15 02:19:45.351: E/Event(682): Could not dispatch event: class com.broadreach.radiotester.io.ExpeditionEvent to subscribing class class com.broadreach.radiotester.screens.OneUpScreen 10-15 02:19:45.351: E/Event(682): android.content.res.Resources$NotFoundException: String resource ID #0x0 10-15 02:19:45.351: E/Event(682): at android.content.res.Resources.getText(Resources.java:247) 10-15 02:19:45.351: E/Event(682): at android.widget.TextView.setText(TextView.java:3428) 10-15 02:19:45.351: E/Event(682): at com.broadreach.radiotester.screens.OneUpScreen.onEvent(OneUpScreen.java:47) 10-15 02:19:45.351: E/Event(682): at java.lang.reflect.Method.invokeNative(Native Method) 10-15 02:19:45.351: E/Event(682): at java.lang.reflect.Method.invoke(Method.java:511) 10-15 02:19:45.351: E/Event(682): at de.greenrobot.event.EventBus.invokeSubscriber(EventBus.java:569) 10-15 02:19:45.351: E/Event(682): at de.greenrobot.event.EventBus.postToSubscription(EventBus.java:500) 10-15 02:19:45.351: E/Event(682): at de.greenrobot.event.EventBus.subscribe(EventBus.java:288) 10-15 02:19:45.351: E/Event(682): at de.greenrobot.event.EventBus.register(EventBus.java:189) 10-15 02:19:45.351: E/Event(682): at de.greenrobot.event.EventBus.registerSticky(EventBus.java:166) 10-15 02:19:45.351: E/Event(682): at com.broadreach.radiotester.screens.OneUpScreen.onResume(OneUpScreen.java:33) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.Fragment.performResume(Fragment.java:1547) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:978) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:482) 10-15 02:19:45.351: E/Event(682): at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 10-15 02:19:45.351: E/Event(682): at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 10-15 02:19:45.351: E/Event(682): at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 10-15 02:19:45.351: E/Event(682): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 10-15 02:19:45.351: E/Event(682): at android.view.View.measure(View.java:12603) 10-15 02:19:45.351: E/Event(682): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 10-15 02:19:45.351: E/Event(682): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 10-15 02:19:45.351: E/Event(682): at android.view.View.measure(View.java:12603) 10-15 02:19:45.351: E/Event(682): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 10-15 02:19:45.351: E/Event(682): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 10-15 02:19:45.351: E/Event(682): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 10-15 02:19:45.351: E/Event(682): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 10-15 02:19:45.351: E/Event(682): at android.view.View.measure(View.java:12603) 10-15 02:19:45.351: E/Event(682): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 10-15 02:19:45.351: E/Event(682): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 10-15 02:19:45.351: E/Event(682): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072) 10-15 02:19:45.351: E/Event(682): at android.view.View.measure(View.java:12603) 10-15 02:19:45.351: E/Event(682): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044) 10-15 02:19:45.351: E/Event(682): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418) 10-15 02:19:45.351: E/Event(682): at android.os.Handler.dispatchMessage(Handler.java:99) 10-15 02:19:45.351: E/Event(682): at android.os.Looper.loop(Looper.java:137) 10-15 02:19:45.351: E/Event(682): at android.app.ActivityThread.main(ActivityThread.java:4340) 10-15 02:19:45.351: E/Event(682): at java.lang.reflect.Method.invokeNative(Native Method) 10-15 02:19:45.351: E/Event(682): at java.lang.reflect.Method.invoke(Method.java:511) 10-15 02:19:45.351: E/Event(682): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 10-15 02:19:45.351: E/Event(682): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 10-15 02:19:45.351: E/Event(682): at dalvik.system.NativeStart.main(Native Method) 10-15 02:19:45.351: D/Event(682): No subscribers registered for event class de.greenrobot.event.SubscriberExceptionEvent 10-15 02:19:45.551: V/BRRT(682): FourUp event received: 204 : 32 10-15 02:19:45.561: W/ResourceType(682): No package identifier when getting value for resource number 0x00000000
Aquí está uno de los fragmentos (se ven iguales):
public class OneUpScreen extends ScreenFragment { private Button name; private TextView c00Title, c00Data; //DEBUG public String title; //DEBUG private int counter = 0; //for logging and convenience private static final String TAG = "BRRT"; @Override public void onResume(){ super.onResume(); EventBus.getDefault().registerSticky(this); } @Override public void onPause(){ EventBus.getDefault().unregister(this); super.onDestroy(); } //process the bus messaging public void onEvent(ExpeditionEvent event){ Log.v(TAG, "OneUp event received: " + event.getEventId() + " : " + event.getEventScreenValue()); c00Data = (TextView) getView().findViewById(R.id.c00Data); c00Data.setText(counter); counter++; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.one_up_screen_layout, container, false); name = (Button) v.findViewById(R.id.lblTitle); c00Title = (TextView) v.findViewById(R.id.c00Title); c00Data = (TextView) v.findViewById(R.id.c00Data); Bundle bundle = this.getArguments(); //initial set up of the text on the screen //null check name.setText((bundle.getString("name") == null) ? "error" : bundle.getString("name")); c00Title.setText((bundle.getString("c00Title") == null) ? "error" : bundle.getString("c00Title")); title = bundle.getString("c00Title"); return v; } public OneUpScreen(){ } public static OneUpScreen newInstance() { OneUpScreen frag = new OneUpScreen(); return frag; } //attach the config for this instance. @Override public void setConfig(ScreenConfig sc){ //set up the data to paint the screen for the first time Bundle b = new Bundle(); //now we have to parse some stuff into a bundle and send the bundle to the fragment b.putString("name", sc.getName()); b.putString("c00Title", sc.getEvents().get(0).getCleanName()); b.putInt("c00Data", sc.getEvents().get(0).getEventID()); //pass it along this.setArguments(b); } @Override public void update(SparseArray<String> sensorDataMap) { Log.v(TAG, "OneUp Update called: " + counter); counter++; } }
El método onEvent es donde estoy buscando aquí. Si nota en el registro, ese método se invoca. Pero, soy incapaz de golpear el textView dentro de él. Originalmente sólo estaba celebrando la referencia a la textview que tomo en el método onCreate (). pero vi y ejemplo donde lo buscas de nuevo en el proceso de eventos, así que me mudé a eso, no hay suerte.
Si saco el:
c00Data.setText(counter);
entonces todo funciona bien.
¿Que me estoy perdiendo aqui?
- Eficacia de la consulta con Parse que utiliza una tienda local en Android
- Detalles técnicos de Android Garbage Collector
- Cómo crear un hilo Looper, a continuación, enviar un mensaje de inmediato?
- ¿Qué es más eficiente Broadcast Receiver o Handler?
- Error de Android Studio: "El método getText () debe ser llamado desde el subproceso de interfaz de usuario, el subproceso inferido actualmente es el trabajador
- Sockets, Threads y Servicios en android, ¿cómo hacerlos trabajar juntos?
- Patrón de bloqueo de múltiples hilos de SQLiteDatabase
- Cargar anuncio (adMob) en el subproceso de fondo
Ok, para cualquiera que venga aquí más tarde, aquí es cómo he resuelto esto …
Resulta que el error clave que estaba viendo no era el error relacionado con el evento, sino el recurso relacionado.
10-15 02:19:45.271: W/ResourceType(682): No package identifier when getting value for resource number 0x00000000
Miré en otra parte en SO y encontré esto:
No hay identificador de paquete al obtener el valor del número de recurso
Luego volví a mi código y reescribí las llamadas TextView.setText () para que parezcan diferentes.
Old way (contador es un int):
c00Data.setText(counter);
Nueva manera:
c00Data.setText(""+counter);
Eso lo hizo. Grité
- Android + java.lang.NullPointerException: Intenta invocar el método de interfaz
- Mejor manera de reproducir un archivo de vídeo?