ARetrofit icon indicating copy to clipboard operation
ARetrofit copied to clipboard

同页面两次以上的starforResult的形式启动的bug

Open guozhiqiang123 opened this issue 5 years ago • 9 comments

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,上面方法被回调两次, 微信截图_20190523225343 微信截图_20190523225415 接着我在跳Activity1的回调里面再跳转Activity2,调试如下: 微信截图_20190523225559 微信截图_20190523225612

guozhiqiang123 avatar May 23 '19 14:05 guozhiqiang123

回头验证一下,有问题的话争取这个周末fix

yifei8 avatar May 23 '19 15:05 yifei8

好的 辛苦了!

guozhiqiang123 avatar May 23 '19 15:05 guozhiqiang123

另外这篇使用fragment的方式处理onActivityResult的方式感觉很神奇,希望能启发作者。如果有更好的解决方式,当我没说!嘻嘻。 https://juejin.im/post/5a4611786fb9a0451a76b565

guozhiqiang123 avatar May 23 '19 15:05 guozhiqiang123

一个小疑问,这里必须在主线程是出于什么考虑呢? 微信截图_20190528112632 以为有时候拿服务可能需要在子线程操作,而且服务配合Rxjava使用的话,可能会多出来线程切换的代码。

guozhiqiang123 avatar May 28 '19 03:05 guozhiqiang123

嗯,可以考虑一下加个可控的配置,上次加这个逻辑也是考虑可能发生线程安全问题。发自我的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" } } ]

yifei8 avatar May 29 '19 15:05 yifei8

另外请教下,现在我们的项目后台可以精准控制到按钮级别,也就是说,每一个按钮的点击,跳转到哪个页面都可以通过后台配置的路由来控制,那么现在注解的书写方式就有点不方便。除了配置成标准路由,在activity下配置Intent过滤以外,还有更好的实现方式吗?因为我们团队的成员都说每个activity下都配置Intent过滤太繁琐了,写了很多重复性的代码,所以来问问。

guozhiqiang123 avatar May 30 '19 01:05 guozhiqiang123

Android四大组件的通信都是要基于intent,没有更好的方式。

yifei8 avatar May 30 '19 05:05 yifei8

那能不能把下面这个类暴露出来呢? 微信截图_20190530132540 这样我们就可以在拦截器中动态去替换原来的routerpath,就可以实现了,伪代码如下:

 Routerfit.register(AppRouter.class).go(String 路由路径);

 @Go("/router/path/common")
    boolean go(@Extra("router")String routerPath);

guozhiqiang123 avatar May 30 '19 05:05 guozhiqiang123

另外这篇使用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;
    }

xiaojinzi123 avatar Jun 09 '19 07:06 xiaojinzi123