多くのクラス (Activity、Fragment、Adapter など) で、オブジェクトにアクセスする必要があります。
だから私はアプリケーションクラスに入れました。(アプリ、ユーザー)
MainAppliction.java
private static MainApplication singleton;
public static MainApplication getApplication() {
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
private UserVo user; // I did not put null value
public UserVo getUser()(...)
public void setUser(UserVo user){...} // Called in LoginActivity
ActivityA.java、ActivityB.java、ActivityC.java
UserVo user;
@Override
public void onCreate(Bundle savedInstanceState) {
//...
app = ((MainApplication) getApplicationContext());
// or app = MainApplication.getApplication();
user = app.getUser(); // Always Not Null
//...
}
@Override
public void onResume() {
user.getData(); // Sometimes NullPointerExeception By GC (Maybe?)
}
Null ポインター例外を防ぐ方法は?
いくつかのアイデアがあると思います。しかし、それらが解決策になるかどうかはわかりません...
1. MainApplication の UserVo ユーザーを Static メンバーに変更する
このように(MainApplication.java)
private static UserVo user;
public static UserVo getUser()(...)
2. UserVo メンバーを使用せずに getUser() を呼び出します
このように (Activity.java)
@Override
public void onResume() {
MainApplication.getApplication().getUser().getData();
}
3. インターフェースを作る(複雑だ…やりたくない)
このように (MainApplication.java)
interface OnUser {
void onUser(UserVo user);
}
public void getUser(OnUser onUser) {
if (user == null)
// Start Login Activity, and receive UserVo from Server.
else
onUser.onUser(user);
}
(Activity.java)
@Override
public void onResume() {
MainApplication.getApplication().getUser(new OnUser() {
void onUser(UserVo user) {
//Do Work.
}
});
}
ヒントを教えてください。