2

シンクロニシティの問題があります。検索しましたが、私の質問と同じ条件の質問が見つかりません。ポインタは大歓迎です。

Eclipse 4.2.1 上の Android 4.1.2

私には 2 つの活動があります。それらを ListActivity と DetailActivity と呼びましょう。ListActivity でボタンを押すと、DetailActivity が開始されます。ユーザーが DetailActivity のデータに変更を加えてから [戻る] ボタンをクリックすると、2 つのことを行います。まず、ダーティ フラグが true の場合に変更をデータベースに保存します。次に、Intent を ListActivity の onActivityResult() メソッドに返します。

問題はタイミングの 1 つです。データベースの更新を行いたいので、DetailActivity の onStop() メソッドでこれを行うのがベスト プラクティスであると読みました。データベースを更新した直後に、Intent を設定し、DetailActivity で setReult() メソッドを呼び出します。

_resultIntent = new Intent();  
_resultIntent.putExtra(ListActivity .DETAIL_RESULT, _currentData);  
Log.d("ListActivity.setUpReturn()", "checkpoint");  
setResult(Activity.RESULT_OK, _resultIntent);  

結果を設定する前に、ListActivity の onActivityResult() メソッドが呼び出されます。ログ呼び出しを全体に配置しましたが、次のように表示されます。

1) ユーザーが DetailActivity にいて、いくつかのデータを変更してダーティ フラグを true に設定します。
2) ユーザーがシステムの戻るボタンをクリックします。
3) DetailActivity が画面から消えます。
4) ListActivity が再表示されます。
5) ログは、ListActivity の onActivityResult()、onRestart()、onStart()、および onResume() メソッドがこの順序で実行されることを示し
ます。 6) その他の内容がログに記録されます。
7) ログは、DetailActiviy の onStop() メソッドが実行されることを最終的に記録します。

これは、データベースを更新して結果の Intent を設定するまでに、呼び出しアクティビティがそれを使用するポイントをすでに過ぎていることを意味します。

データベースを常に更新したくありません。ベストプラクティスが言うように、これを onStop() メソッドに入れたいのですが、タイミングの問題を回避する方法がわかりません。助言がありますか?私は明らかに間違ったことをしていますか?

4

4 に答える 4

3

アクティビティを行ったSingleInstanceかどうかを確認しますSingleTop

于 2012-11-30T17:39:36.230 に答える
1

確率ではなく、イベント ベースのコード ロジックに依存したいと思います。以下を試すことができます。

* 1) ユーザーが DetailActivity にいて、いくつかのデータを変更してダーティ フラグを true に設定します。2) ユーザーがシステムの戻るボタンをクリックします。*

onBackPressed メソッドをオーバーライドし、そこでデータベース操作を実行します。DB 操作が実行されたら、super.onBackPressed() メソッドを呼び出して Android アクティビティ スタックに引き継がせることができます。DB操作には時間がかかる可能性があることに注意してください。したがって、AsyncTaskをコールバックとともに使用してから、finish()を呼び出すこともお勧めします。

于 2012-11-30T17:50:09.427 に答える
0

これonPause()は、アクティビティがフォーカスを失った直後に呼び出されるためです。ただし、onStop()アクティビティが破棄されるときに呼び出されます (通常、十分なメモリがない場合)。したがって、コードをonPause()メソッドに入れれば問題ありません...

于 2012-11-30T17:39:21.337 に答える
0

私にとって最良の解決策は、PravinCG によるものでした。今後はこれをパターンとして使用します。

@Override
public void onBackPressed() {
    Log.d("DetailActivity.onBackPressed()", "checkpoint");
    if (_currentDataIsDirty) {
        DoDatabaseWork(_currentData);
    }
    _resultIntent = new Intent();
    _resultIntent.putExtra(ListActivity .DETAIL_RESULT, _currentData);
    setResult(Activity.RESULT_OK, _resultIntent);
    super.onBackPressed();
}

ドグラス

于 2012-11-30T20:51:20.753 に答える