假设我的应用程序中有一个语言更改事件接口(它基于Vaadin):
public interface ILanguageChangeListener{
@Subscribe onLanguageChange(LanguageChangeEvent event);
}
Run Code Online (Sandbox Code Playgroud)
我有很多bean实现了这个用@Component注释的接口,因此它们可以在Spring IoC中使用.我还有一个EventBus bean:
<bean id="languageSwitcher" class="com.google.common.eventbus" scope="session" />
Run Code Online (Sandbox Code Playgroud)
现在,在从IoC获取任何bean的实例之后,我还必须得到一个languageSwitcher的实例,并在其中注册newely创建的bean:
languageSwitcher.register(myNewBean);
Run Code Online (Sandbox Code Playgroud)
为了接收这个事件.有可能以某种方式告诉IoC我想在每个实现ILanguageChangeListener的新bean上调用languageSwitcher bean的register方法吗?
通过使用EventBus,我需要在Activity中发布一个事件(MyEvent)并在Android中的另一个Activity中接收该事件.我尝试了greenrobot EventBus性能测试项目,但无法做到这一点.
我在ActivitySubscriber中尝试过
MyEvent event = new MyEvent();
EventBus.getDefault().post(event);
Run Code Online (Sandbox Code Playgroud)
并试图在接收事件ActivityReceiver为
EventBus.getDefault().register(this);
public void onEvent(MyEvent event){
....
}
Run Code Online (Sandbox Code Playgroud)
但是我无法收到这个活动.任何人都可以让我知道我在哪里做错了吗?
我试图围绕Rails中的服务器发送事件进行直播.我有一个Rake任务侦听文件更改,这会将记录添加到数据库中.一旦添加,我想发送一个SSE到前端.
但是,模型不能向前端发送事件,控制器负责.如何告诉我的控制器将新记录添加到数据库中?
到目前为止我的(破碎)解决方案:在模型中使用带有回调的EventBus,after_save它会通知更改并要求控制器监听这些消息:
require 'reloader/sse'
class SseController < ApplicationController
include ActionController::Live
def index
response.headers['Content-Type'] = 'text/event-stream'
sse = Reloader::SSE.new(response.stream)
EventBus.subscribe(:added) do |payload|
sse.write({ /* payload */ })
end
rescue IOError
ensure
sse.close
end
end
Run Code Online (Sandbox Code Playgroud)
我认为我的请求在收到事件之前就结束了,这意味着它永远不会在de subscribe块中结束.这是正确的方法,如果是这样,我错过了什么?
我一直试图调试这个东西几个小时,我真的不能在这里看到问题.
这是我的MainActivity.这里要寻找的主要是ArrayList<Servico>作为Servico自定义对象.我创建了一个简单的"事件"类 - ServicoActual只有一个Servico对象引用(和构造函数/ getter):
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.SearchManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import net.pedromoreira.billper.events.ServicoActual;
import java.util.ArrayList;
import java.util.Locale;
import de.greenrobot.event.EventBus;
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle …Run Code Online (Sandbox Code Playgroud) 我在Android上使用GreenRobot EventBus lib.
有人能告诉我,调用removeStickyEvent(...)的最佳做法是什么?Up-Action,后退按钮,......?
感谢你们.
我开始在我的应用程序中使用EventBus并且它非常好用,它解决了很多问题并简化了代码,并且在所有线程和所有内容的应用程序中传播都很棒,但我觉得我可能会滥用使用事件.
现在一切都很好,我正在测试强大的设备,应用程序响应非常好,但我还有很多编码要做,我开始质疑自己将如何影响有太多事件触发全部应用程序.
所以问题是对于那些有使用该库经验的人,如果我的应用程序中有很多事件存在问题,如果存在与使用此事件相关的一些已知内存问题.我试图明智地使用它,但很难不在你的架构中包含它很多,因为它是一个非常好的功能.无论如何,如果你对这个主题有什么想说的话会很好,因为我有很多编码要做,如果我的架构出错就会出现问题,并且由于与事件有关的一些问题而不得不回去做更改.
PD.我说的是原生Android应用程序,有很多网络
谢谢
我正在使用Rx-ified API for vertx,这个问题必须做一个潜在的无限重试 - 直到成功循环我想实现但是有困难.我是RxJava的新手.
这是我想做的事情:
我遇到的第一个问题是如何完成步骤2).
如果您熟悉vert.x Rx api,这就是在上面的步骤1)中发出请求的意思:
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject );
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个Observable实例,该实例将发出响应或错误(例如,如果有超时).Observable将永远不会再发出任何东西(或者每次订阅时它总会发出完全相同的东西,我不知道哪个).
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
.retry()
Run Code Online (Sandbox Code Playgroud)
我认为为了发出重试,我可以使用RxJava的retry()运算符,我尝试过,但由于源可观察的性质,这样做完全没有任何有用的效果.没有新的请求消息被发送,因为唯一被"重试"的是订阅原始源,它永远不会发出任何不同的东西.
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
.retryWhen( error -> {
return _vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
})
Run Code Online (Sandbox Code Playgroud)
所以我想我可以使用RxJava的retryWhen()运算符,它允许我在根observable发出错误时发出第二个observable.我想,第二个可观测量可能与上面第一步产生初始观察者的代码相同.
但是,retryWhen()运算符(请参阅文档)不允许第二个observable发出错误而不会因错误而结束订阅.
所以,我无法弄清楚如何在这个链的第一部分内建立一个潜在的无限重试循环.
我必须在这里遗漏一些东西,但我无法确定它是什么.
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
// imagine that retryWhen() accomplishes an infinite retry
.retryWhen( error -> {
return _vertx.eventBus().<JsonObject>sendObservable( ... )
})
.flatMap( response -> {
// inspect response, if it has …Run Code Online (Sandbox Code Playgroud) 在我目前的设置中,我使用的是Hazelcast集群管理器的默认多播选项.当我链接我的容器化Vertx模块的实例(通过Docker网络链接)时,我可以看到他们成功创建了Hazelcast集群.但是,当我尝试从一个模块在事件总线上发布事件时,另一个模块不会对它做出反应.我不确定Hazelcast群集中的网络设置如何与事件总线的网络设置相关.
目前,我为每个Vert.x模块配置了以下编程配置,每个模块都部署在一个docker容器中.
ClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions vertxOptions = new VertxOptions()
.setClustered(true)
.setClusterManager(clusterManager);
vertxOptions.setEventBusOptions(new EventBusOptions()
.setClustered(true)
.setClusterPublicHost("application"));
Run Code Online (Sandbox Code Playgroud)
Vert.x Core手册指出我可能需要配置clusterPublicHost和clusterPublicPort事件总线,但我不确定它们与一般网络拓扑有何关联.
我正在尝试用RxAndroid替换EventBus。
我希望可分页的片段订阅/取消订阅事件源,这些片段的创建和丢弃相对较快,具体取决于用户滑动到新页面的速度。
在EventBus中,我能够添加修饰的回调方法(例如@Subscribe(threadMode = ThreadMode.MAIN)),并在片段的onStart / onStop方法中注册/注销。
现在,使用RxJava2 PublishSubject在类中创建一个对象
public static PublishSubject<List<Long>> m_psUpdatedDays = PublishSubject.create();
public static void publishUpdatedDays(List<Long> lDay) {
m_psUpdatedDays.onNext(lDay);
}
Run Code Online (Sandbox Code Playgroud)
并通过Fragment的onStart方法调用以下内容来订阅该发布者在另一个类中的操作:
m_psUpdatedDays.observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Long>>() {
@Override public void onSubscribe(Disposable d) {}
@Override public void onNext(List<Long> longs) {
...
Update Fragment UI here
...
}
@Override public void onError(Throwable e) {}
@Override public void onComplete() {}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,当onStop系统调用Fragment的方法时,如何取消订阅该新的Observer ?
我是否需要存储Disposable获取到的对象,onSubscribe然后.dispose()在onStop方法中对其进行调用?
Guava EventBus文档说 "一般情况下,处理程序不应抛出.如果这样做,EventBus将捕获并记录异常.这很少是错误处理的正确解决方案,不应该依赖;它仅用于帮助在开发过程中发现问题."
如果您知道可能发生某些异常,则可以使用EventBus注册SubscriberExceptionHandler并使用它来处理这些异常.
但是如果发生未处理的异常会发生什么?通常情况下,我希望一个未处理的异常"冒泡"调用链.使用SubscriberExceptionHandler时,我可以访问事件处理程序中抛出的原始异常,我只想重新抛出它.但我无法弄清楚如何.
那么,无论是否使用SubscriberExceptionHandler,如何确保事件处理程序中的意外异常不会被"吞噬"?
任何帮助将不胜感激.