简单的BusProvider.getInstance().post()
不是例外main thread
.如何使用Otto事件总线将事件从Service发送到Activity?
我非常喜欢开源贡献广场已经对Android社区做了什么,并正在调查他们的最新贡献Otto(事件总线)
深入挖掘我看到Otto使用反射并且没有有序广播(一种模式,其中未消息的消息从一个接收器传递到下一个接收器,听取相同类型的事件)Otto相信更多的火灾和忘记模型.
现在android LocalBroadcastManager
在其v4支持库中有(LBM)用于相同的目的,尽管它更笨重并且对传递的对象有更多限制.但在更明亮的一面,它确实支持有序广播,它更像是正常的广播.
Otto和LBM都处于相同的处理空间内,因此就速度而言,我猜两者都是相同的.我能看到的唯一真正的区别是Otto允许您定义自定义事件,而您不必序列化/包裹对象.
因此,我真正的问题是,如果LBM做同样的事情,你何时会使用Otto.
参考文献:
http://nick.perfectedz.com/otto-event-system/
https://plus.google.com/107049228697365395345/posts/6j4ANWngCUY
在大多数情况下,处理案件时
AsyncTask
)执行后台处理Activity
或Fragment
Activity
或者Fragment
在用户线程完成后台处理之前可能会重新创建到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段
我不时地听说事件总线库可以处理活动,片段和后台线程之间的关系.(请参阅https://github.com/greenrobot/EventBus.它表示在活动,片段和后台线程中表现良好)
我遇到了一些非常受欢迎的事件总线库
我想知道,当处理活动,碎片和后台线程之间的关系时,事件总线方法与保留碎片方法有何不同?
推荐哪种方式?
android event-bus android-asynctask otto greenrobot-eventbus
我了解如何使用Intents与系统/其他应用程序进行通信.我了解如何在同一个应用程序中使用Intent.我也了解如何使用Otto在同一个App中进行通信.
使用Otto vs. Intents在我的活动/服务之间进行交流的Pro/Cons是什么?
在活动中注册和注销事件总线(如otto,EventBus或tinybus)的最佳位置是什么?为什么?
Otto的例子使用onResume() - onPause(),EventBus提到onStart() - onStop(),我们需要在我们的应用程序中使用onCreate() - onDestroy()来更新活动的UI,即使它在后台也是如此.所以我想它可以是三个中的任何一个,取决于事件的性质和它们的处理,但我想知道是否还有其他任何应该考虑的事情.
我有一个奇怪的问题.我有一个应用程序,我部署在Android 4.4设备上并使用Otto库.我在Android 5.0设备上部署了该应用程序.它仍然有效.我重新尝试了4.4,该应用程序将无法启动.
显然,它试图使用API 21类的PersistableBundle.class.在这里我的日志:
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.getDeclaredMethods(Native Method)
at java.lang.Class.getDeclaredMethods(Class.java:656)
at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.java:52)
at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.java:126)
at com.squareup.otto.HandlerFinder$1.findAllProducers(HandlerFinder.java:33)
at com.squareup.otto.Bus.register(Bus.java:191)
Run Code Online (Sandbox Code Playgroud) 我们当前的app-version与otto的EventHandler存在问题.我们RuntimeException
在崩溃日志中获得了一个以下描述:
"原因:java.lang.RuntimeException:无法调度事件:classcom.nameOfBrand.ui.events.SwitchFragmentEvent to handler [EventHandler public void com.nameOfBrand.ui.activities.MainActivity.onSwitchFragmentEvent(com.nameOfBrand.ui.events.SwitchFragmentEvent) )]"
我们有一个按钮,在onClickListener中我们自动定义SwitchFragmentEvent
.在一些奇怪的情况下,框架无法调度事件并抛出一个RuntimeException
.
带按钮的片段延伸AbstractResultListFragment
,这个片段延伸AbstractFragment
.我们在AbstractFragement的onResume中注册EventBus,并在onPause上注销它.一切正常,除了这一个按钮:/
有没有人有这样的想法或曾经做过这样的事情?
更新: Scompt是对的.RuntimeException是从我们的代码中的NullPointerException的原因引发的.谢谢
提普:阅读你的崩溃日志直到最后;)
我正在使用Otto Event总线订阅ListFragment中的某些事件.总线实例在Application的子类中存储和创建,换句话说,它应该作为单例工作.看来这不是一个案例......
该片段正在注册到总线onActivityCreated(Bundle)
并取消注册onDestroy()
.这不起作用.我从调用应用程序崩溃的设备获得了几个崩溃报告unregister()
(java.lang.IllegalArgumentException:缺少注释方法的事件处理程序......).如果unregister()
在调用register()之前调用,或者unregister()
调用两次,则抛出此异常.这可能只发生在......
onActivityCreated(Bundle)
之前没有打过电话onDestroy()
.onDestroy()
被叫两次.Application
实例调用之间重建onActivityCreated(Bundle)
和onDestroy()
.我的应用类:
public class App extends Application {
private static App sInstance;
private Bus bus;
public static App getInstance() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
bus = new Bus(ThreadEnforcer.ANY);
}
public Bus getEventBus() {
return bus;
}
}
Run Code Online (Sandbox Code Playgroud)
Fragment类:
public class MyFragment extends ListFragment {
@Override
public void …
Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-fragments otto fragment-lifecycle
我有一个SearchView
设置,我有一个松散的解耦架构使用Retrofit
和Otto
.
我想知道Android中的搜索或者任何移动应用程序的最佳实践是什么(意味着类似的东西也可以应用于iOS).
具体来说,我正在使用一个AutoCompleteTextView
来处理我的建议,SearchView
数据直接来自API
.我不相信这是一种最佳实践,因为每次用户更改文本时SearchView
都会启动API调用.
我正在考虑在SQLite中存储一个Cache然后从那里ping结果,但是如果用户想要最直接的数据呢?你会怎么处理?采用什么样的模式?
非常感谢有关Android中搜索的最佳架构或方法的任何想法.