ARetrofit
ARetrofit copied to clipboard
同页面两次以上的starforResult的形式启动的bug
Routerfit.register(AppRouter.class).skipActivity1("参数1", new ActivityCallback() {
@Override
public void onActivityResult(int result, Object data) {
Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_SHORT).show();
Routerfit.register(AppRouter.class).skipActivity2(new ActivityCallback() {
@Override
public void onActivityResult(int result, Object data) {
Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_SHORT).show();
}
});
}
});
第二次的回调一定不会成功。
而且我还发现一个问题,比如 Routerfit.setResult(Routerfit.RESULT_OK),但是
void setResult(String key, @IntRange(from = -1, to = 0) int result, Object data) {
ActivityCallback callback = map.get(key);
if (callback != null) {
callback.onActivityResult(result, data);
map.remove(key);
}
}
这个方法总会回调两次,我不知道这个是否是正常的。下面我会贴上调试的图片。
这是我先跳转Activity1,上面方法被回调两次,
接着我在跳Activity1的回调里面再跳转Activity2,调试如下:
回头验证一下,有问题的话争取这个周末fix
好的 辛苦了!
另外这篇使用fragment的方式处理onActivityResult的方式感觉很神奇,希望能启发作者。如果有更好的解决方式,当我没说!嘻嘻。 https://juejin.im/post/5a4611786fb9a0451a76b565
一个小疑问,这里必须在主线程是出于什么考虑呢?
以为有时候拿服务可能需要在子线程操作,而且服务配合Rxjava使用的话,可能会多出来线程切换的代码。
嗯,可以考虑一下加个可控的配置,上次加这个逻辑也是考虑可能发生线程安全问题。发自我的iPhone------------------ 原始邮件 ------------------发件人: 小小强 [email protected]发送时间: 2019年5月28日 11:29收件人: yifei8/ARetrofit [email protected]抄送: yifei [email protected], Comment [email protected]主题: 回复:[yifei8/ARetrofit] 同页面两次以上的starforResult的形式启动的bug (#13)一个小疑问,这里必须在主线程是出于什么考虑呢?
以为有时候拿服务可能需要在子线程操作,而且服务配合Rxjava使用的话,可能会多出来线程切换的代码。
—You are receiving this because you commented.Reply to this email directly, view it on GitHub, or mute the thread. [ { "@context": "http://schema.org", "@type": "EmailMessage", "potentialAction": { "@type": "ViewAction", "target": "https://github.com/yifei8/ARetrofit/issues/13?email_source=notifications\u0026email_token=AIF4X7T5P7ESYGR4M4FWWP3PXSRJBA5CNFSM4HPGROX2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWK3XTA#issuecomment-496352204", "url": "https://github.com/yifei8/ARetrofit/issues/13?email_source=notifications\u0026email_token=AIF4X7T5P7ESYGR4M4FWWP3PXSRJBA5CNFSM4HPGROX2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWK3XTA#issuecomment-496352204", "name": "View Issue" }, "description": "View this Issue on GitHub", "publisher": { "@type": "Organization", "name": "GitHub", "url": "https://github.com" } } ]
另外请教下,现在我们的项目后台可以精准控制到按钮级别,也就是说,每一个按钮的点击,跳转到哪个页面都可以通过后台配置的路由来控制,那么现在注解的书写方式就有点不方便。除了配置成标准路由,在activity下配置Intent过滤以外,还有更好的实现方式吗?因为我们团队的成员都说每个activity下都配置Intent过滤太繁琐了,写了很多重复性的代码,所以来问问。
Android四大组件的通信都是要基于intent,没有更好的方式。
那能不能把下面这个类暴露出来呢?
这样我们就可以在拦截器中动态去替换原来的routerpath,就可以实现了,伪代码如下:
Routerfit.register(AppRouter.class).go(String 路由路径);
@Go("/router/path/common")
boolean go(@Extra("router")String routerPath);
另外这篇使用fragment的方式处理onActivityResult的方式感觉很神奇,希望能启发作者。如果有更好的解决方式,当我没说!嘻嘻。 https://juejin.im/post/5a4611786fb9a0451a76b565
这种方式本来就会更好,不用写类似 setResult 等方法去返回数据的,唯一需要作者注意的有两点,我这里提个醒吧,我都踩过坑了:
- 这种情况下Context 不能再传 Application 或者使用框架默认的 Application 了
- 当你在 Dialog 的时候传的 Context 不是一个 Activity 类型,这种作者需要通过 While 找到 Activity,代码可以参考下面提供的
@Nullable
public static Activity getActivityFromContext(@Nullable Context context) {
if (context == null) {
return null;
}
Activity realActivity = null;
if (context instanceof Activity) {
realActivity = (Activity) context;
} else {
// 最终结束的条件是 realContext = null 或者 realContext 不是一个 ContextWrapper
Context realContext = context;
while (realContext instanceof ContextWrapper) {
realContext = ((ContextWrapper) realContext).getBaseContext();
if (realContext instanceof Activity) {
realActivity = (Activity) realContext;
break;
}
}
}
return realActivity;
}