9

Jake Wharton 在 Devoxx 2013 上的演讲,使用 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 的任何人都可以提供有关您在应用程序中所做的任何见解吗?您只是在“登录”图中没有单例对象吗?

4

1 回答 1

12

解决方案非常简单,您只需执行一次“加号”操作并将新对象图存储在其他地方(可能是应用程序类),但我想知道这是否是一个好方法?

是的。登录图的生命周期需要在用户登录并且进程存在的情况下存在。由于活动的生命周期非常短,所以这不是一个好地方。

我用它作为一个例子来让人们使用他们熟悉的东西来简化这个概念。

Square 的任何人都可以提供有关您在应用程序中所做的任何见解吗?

所有与 UI 无关的图表都由一个Application类管理。通过这一点,我们可以保证它被创建一次,首先被创建,并且只有在进程终止时才会消失。

随着 UI 的出现和消失,任何与 UI 相关的内容(活动范围图、片段范围图等)都会在这些之上加上。

于 2014-04-07T06:13:46.000 回答