Devoxx 2013 での Jake Wharton のトーク、Architecting Android Applications with Dagger では、ログイン ユーザーのみの 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 で作成されるため)。
解決策は非常に簡単です。この「プラス」操作を 1 回行うだけで、新しいオブジェクト グラフを別の場所 (アプリケーション クラスなど) に保存できますが、これが良いアプローチであるかどうか疑問に思っていました。Square の誰かが、アプリケーションで何をしているかについて何か洞察を提供できますか? 「ログイン」グラフにシングルトン オブジェクトがありませんか?