Tutorial Expansion - SharryChoo/SRouter GitHub Wiki
如果你不想写 Intent 参数注入的代码, @Query 注解可以帮你完成这个操作
public class FoundFragment extends Fragment {
@Query(key = "title")
String title = "default_title";
@Query(key = "amount")
double amount = 1.0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SRouter.bindQuery(this);
......// 处理后续操作
}
}
如果你习惯了 RxJava 的链式调用, 并为 navigation 是异步回调导致不能链式编写代码而苦恼, 那么这个回调适配器可能会解决你的问题
这里以将 ICall 适配成 RxJava 的 Observable 为例
实现 ICallAdapter 接口编写 RxJava 的适配器
public class RxJavaAdapter implements ICallAdapter<ResponseObservable> {
@Override
public ResponseObservable adapt(@NonNull ICall call) {
return new ResponseObservable(call);
}
@Override
public Class<ResponseObservable> adaptType() {
return ResponseObservable.class;
}
}
public final class ResponseObservable extends Observable<Response> {
private final ICall call;
ResponseObservable(ICall call) {
this.call = call;
}
@Override
protected void subscribeActual(final Observer<? super Response> observer) {
// Since Call is a one-shot type, clone it for each new observer.
ICancelable cancelable = call.post(new IInterceptor.ChainCallback() {
@Override
public void onSuccess(@NonNull Response response) {
observer.onNext(response);
}
@Override
public void onFailed(Throwable throwable) {
observer.onError(throwable);
}
@Override
public void onCanceled() {
// do nothing.
}
});
observer.onSubscribe(new CallDisposable(cancelable));
}
private static final class CallDisposable implements Disposable {
private final ICancelable cancelable;
CallDisposable(ICancelable cancelable) {
this.cancelable = cancelable;
}
@Override
public void dispose() {
cancelable.cancel();
}
@Override
public boolean isDisposed() {
return cancelable.isCanceled();
}
}
}
SRouter.addCallAdapter(new RxJavaAdapter());
val disposable = SRouter.request(ModuleConstants.App.NAME, ModuleConstants.App.LOGIN_ACTIVITY)
// 构建 Activity 相关配置
.setRequestCode(100)
.addInterceptorURI(ModuleConstants.Personal.PERMISSION_INTERCEPTOR)
.newCall(chainContext.baseContext)
// 将 ICall 转为 ResponseObservable
.adaptTo(ResponseObservable::class.java)
// 这里可以获取到一个 Observable<Response> 类型的数据源
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if (it.activityResult.resultCode == RESULT_OK) {
SRouter.navigation(chainContext.baseContext, chainContext.request)
}
}
public interface RouteApi {
@RouteMethod(
authority = ModuleConstants.Found.NAME,
path = ModuleConstants.Found.FOUND_FRAGMENT
)
ResponseObservable foundFragment(
@QueryParam(key = "title") double title,
@QueryParam(key = "content") String content
);
/**
* @param context 若无 context 参数, 会使用 application context 跳转
*/
@RouteMethod(
authority = ModuleConstants.Personal.NAME,
path = ModuleConstants.Personal.PERSONAL_ACTIVITY,
interceptorURIs = ModuleConstants.App.LOGIN_INTERCEPTOR
)
ResponseObservable personalCenter(
Context context,
@QueryParam(key = "content") String content,
@RequestCode int requestCode,
@Flags int flags
);
}
这里只是以 RxJava 举例, 你可以自行实现 ICallAdapter 接口, 将路由的 ICall 适配成任何你想要的对象