私はAndroid用のノートテイクアプリを構築しています。 アクティビティ間で値(データ/オブジェクト)を共有する苦労を緩和するために、<key,object>
のペアをHashTable
に格納するIntentHelperクラスを書きました。HashTableを使用してアクティビティ間でデータを渡す
public class IntentHelper {
private static IntentHelper _instance;
private static Hashtable<String, Object> _hash;
private IntentHelper() {
_hash = new Hashtable<>();
}
public static IntentHelper getInstance() {
if (_instance == null) {
_instance = new IntentHelper();
}
return _instance;
}
public static void addObjectForKey(Object obj, String key) {
getInstance()._hash.put(key, obj);
}
public static Object getObjectForKey(String key) {
IntentHelper helper = getInstance();
Object data = helper._hash.get(key);
helper._hash.remove(key);
helper = null;
return data;
}
}
あなたはIntentHelperクラスを見れば、それはまたそれを取得した後、ハッシュテーブルから<key, object>
ペアを削除します。これは単に最適化のためのものでした。
Note
は、メンバー変数がString
のJava POJOです。
IntentHelperを使用して、私はNote
オブジェクト2の間の活動に沿って通過するのですが、私はアプリを実行すると、エラーでクラッシュ:
java.lang.RuntimeException: Unable to resume activity {co.kodr.note/co.kodr.note.activity.NoteViewActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String co.kodr.note.model.Note.getNoteDescription()' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String co.kodr.note.model.Note.getNoteDescription()' on a null object reference
at co.kodr.note.activity.NoteViewActivity.reDrawView(NoteViewActivity.java:47)
at co.kodr.note.activity.NoteViewActivity.onResume(NoteViewActivity.java:54)
を私はアプリをデバッグするとき、私が見ることができるNote
オブジェクトIntentHelperから取得したものがnullではありません。ここ2の活動は以下のとおりです。
MainActivity
public class MainActivity extends AppCompatActivity {
Note note;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.single_note_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
reDrawNoteList();
}
private void reDrawNoteList() {
Cursor cursor = Utils.readFromDatabase(this, Constants.SELECT_ALL_NOTES);
ListView notesList = (ListView) findViewById(R.id.noteList);
NoteCursorAdapter noteCursorAdapter = new NoteCursorAdapter(this, cursor);
notesList.setAdapter(noteCursorAdapter);
notesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
note = (Note) view.getTag();
startNoteViewActivity();
}
});
}
@Override
protected void onResume() {
super.onResume();
reDrawNoteList();
}
private void startNoteViewActivity(){
IntentHelper.getInstance().addObjectForKey(note, Constants.SINGLE_NOTE);
Intent note_view_intent = new Intent(MainActivity.this, NoteViewActivity.class);
startActivity(note_view_intent);
}
}
NoteViewActivity
public class NoteViewActivity extends AppCompatActivity {
Note note;
private CustomTextView noteTitle;
private CustomTextView noteText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note_view);
Toolbar toolbar = (Toolbar) findViewById(R.id.single_note_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
noteTitle = (CustomTextView) findViewById(R.id.tv_NoteDescription);
noteText = (CustomTextView) findViewById(R.id.tv_NoteText);
reDrawView();
}
private void reDrawView(){
note = (Note) IntentHelper.getObjectForKey(Constants.SINGLE_NOTE);
noteTitle.setText(note.getNoteDescription());
noteText.setText(note.getNoteText());
}
@Override
protected void onResume() {
super.onResume();
reDrawView();
}
}
私はそれを取得中に、私は停止することができますので、問題は何とか周り、
<key, value>
ペアを削除していることを知っている
アプリがコメントアウトしてクラッシュするのを防ぐ:
helper._hash.remove(key);
アプリの新発売(onCreate
)とOnResume
の問題が発生しています。 OnResume
ではなぜそれが起こっているのかわかりますが、OnCreate
では見えません。
誰かが実際の問題をここで説明できますか?
渡す
Parcelable
オブジェクトを使用してonSaveInstanceState
とonRestoreInstanceState
活動内のメソッド、またはIntent.putExtra
を使用することができますシングルトンハッシュテーブルが悪いアイデアのように思えます。意図的にデータを正しく移動するためにパーセル可能性を使用する –
@ cricket_007シングルトンハッシュテーブルの特定の問題はありますか? – Anurag
シングルトンはあなたがやろうとしていることに対する反パターンです。さらに、すでにデータベースを持っているので、そこに永続的なレイヤーがあります。 –