一,我本想着研究RxBus如Intent那样定向传值,但是技术有限或者是本就不能实现,我只做出了页面的回传值,比如第a1页面跳转到a2页面,a2页面返回的时候带回需要的值。
1.首先添加依赖,
compile 'io.reactivex.rxjava2:rxjava:2.0.8'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
2.RxBus本不是库,而是一种模式,现在我们需要两个接口类来配置一下;
public interface Function<Result, Param> {
Result function(Param... data);
}
-----------------------------------
public interface IObservable<T, P, R> {
/**
* 根据名称注册观察者
*/
void registerObserver(String name, T observer);
/**
* 根据名称反注册观察者
*/
void removeObserver(String name);
/**
* 根据观察者反注册
*/
void removeObserver(T observer);
/**
* 根据名称和观察者反注册
*/
void removeObserver(String name, T observer);
/**
* 根据名称获取观察者
*/
Set<T> getObserver(String name);
/**
* 清除观察者
*/
void clear();
/**
* 通知观察者
*
* @param name 名称
* @param p 参数
*/
R notify(String name, P... p);
}
---------------------------
3.创建RxBus类如下;
public class RxBus<Param, Result> implements IObservable<Function, Param, Result> {
private static final String TAG = "RxBus";
private HashMap<String, Set<Function>> _mapping;
private final Object _lockObj = new Object();
private static RxBus _instance;
public RxBus() {
this._mapping = new HashMap<>();
}
public static RxBus newInstance() {
if (_instance == null) _instance = new RxBus();
return _instance;
}
@Override
public void registerObserver(String name, Function observer) {
synchronized (_lockObj) {
Set<Function> observers;
if (!_mapping.containsKey(name)) {
observers = new HashSet<>();
_mapping.put(name, observers);
} else {
observers = _mapping.get(name);
}
observers.add(observer);
}
}
@Override
public void removeObserver(String name) {
synchronized (_lockObj) {
_mapping.remove(name);
}
}
@Override
public void removeObserver(Function observer) {
synchronized (_lockObj) {
for (String key : _mapping.keySet()) {
Set<Function> observers = _mapping.get(key);
observers.remove(observer);
}
}
}
@Override
public void removeObserver(String name, Function observer) {
synchronized (_lockObj) {
if (_mapping.containsKey(name)) {
Set<Function> observers = _mapping.get(name);
observers.remove(observer);
}
}
}
@Override
public Set<Function> getObserver(String name) {
Set<Function> observers = null;
synchronized (_lockObj) {
if (_mapping.containsKey(name)) {
observers = _mapping.get(name);
}
}
return observers;
}
@Override
public void clear() {
synchronized (_lockObj) {
_mapping.clear();
}
}
public Result notify(String name, Param... param) {
synchronized (_lockObj) {
if (_mapping.containsKey(name)) {
Set<Function> observers = _mapping.get(name);
for (Function o : observers) {
return (Result) o.function(param);
}
}
return null;
}
}
}
-------------------------------------
ai页面要做的是接收数据
主要代码如下;
private void initView() {
but = (Button) findViewById(R.id.but);
but.setOnClickListener(MainActivity.this);
text = (TextView) findViewById(R.id.text);
RxBus.newInstance().registerObserver("TT", new Function() {
@Override
public Object function(Object[] data) {
text.setText((String)data[0]);
return null;
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销监听
RxBus.newInstance().removeObserver("TT");
}
a2页面主要做的是传送数据
主要代码如下;
@Override
public void onClick(View view) {
if (view.getId() == R.id.but) {
RxBus.newInstance().notify("TT", "黄家驹");
} else if (view.getId() == R.id.text) {
finish();
}
}
好了就这样很简单的值的回传。我本菜鸟,还做不到灵活运用,我相信还有很多功能没开发出来,这只是一小步,后边如果有新的发现我会继续发出来的;不喜勿喷/
RxBus实现页面值的回传
最新推荐文章于 2021-04-10 13:44:39 发布