Dagger在Android中的作用域

9
Jake Wharton在2013年Devoxx的演讲中,谈到了使用Dagger构建Android应用程序时,为仅已登录用户创建Dagger范围的方法。这种方法听起来非常简洁,我也想在我的应用程序中尝试一下。
在演讲中讨论的代码大致如下:
public class LoggedInActivity extends Activity {

    @Inject User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);

        DaggerScopesApp app = (DaggerScopesApp) getApplication();
        app.getObjectGraph().plus(new UserModule("exampleusername")).inject(this);

        findViewById(R.id.do_something_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(LoggedInActivity.this, user.username + " : " +
                        user.someValue++, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

然而,如果注入的用户作为@Singleton进行范围限定,则其属性将在配置更改时消失(因为对象图在onCreate中创建)。

解决方案非常简单,您只需执行此“加”操作一次,并将新的对象图存储在其他地方(例如应用程序类)即可,但我想知道这是否是一个好方法? Square的任何人都可以提供有关您在应用程序中所做的操作的见解吗?您是否只是在“已登录”图形中没有单例对象?

1个回答

12
解决方案很简单,您只需进行一次“加”操作并将新的对象图存储在其他位置(可能是应用程序类),但我想知道这是否是一个好方法?
是的。已登录的图形的生命周期需要与用户登录和进程一样长。由于活动的生命周期非常短,因此这不是一个好的位置。
我将其用作示例,以使人们通过使用他们熟悉的内容来理解该概念。
有没有来自Square的任何人可以提供关于您在应用程序中所做的任何见解?
所有未与UI相关联的图形都由类管理。通过这种方式,我们保证了它仅创建一次,首先被创建,并且仅在进程死亡时消失。
任何与UI相关的内容(活动范围图、片段范围图等)都会在其上加上,因为UI来来去去。

4
您的自定义Application类中是否有多个ObjectGraphs?是否有一个包含AuthModule或不包含AuthModule(根据用户是否已经通过身份验证)的单一ApplicationGraph?或者在这种情况下,您是否会有2个图表... 一个ApplicationGraph和一个AuthedGraph?如果是这样,那么这个AuthedGraph本质上是“ApplicationGraph.plus(new AuthModule())”吗? - loeschg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接