2017-02-21 10 views
-1

私は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では見えません。

誰かが実際の問題をここで説明できますか?

+0

渡すParcelableオブジェクトを使用してonSaveInstanceStateonRestoreInstanceState活動内のメソッド、またはIntent.putExtraを使用することができます

シングルトンハッシュテーブルが悪いアイデアのように思えます。意図的にデータを正しく移動するためにパーセル可能性を使用する –

+0

@ cricket_007シングルトンハッシュテーブルの特定の問題はありますか? – Anurag

+0

シングルトンはあなたがやろうとしていることに対する反パターンです。さらに、すでにデータベースを持っているので、そこに永続的なレイヤーがあります。 –

答えて

0

onCreateが発生したときにオブジェクトを削除すると、ハッシュテーブルでそのキーを使用して他のアクティビティを開始しようとしたり、いくつかのアクティビティに戻ったりすることが問題です。この時点で、オブジェクトはハッシュテーブルから削除されます。あなたは周りのParcelable

関連する問題