1

私のAndroidアプリでは、ユーザーが1つのアクティビティから別のアクティビティに移行しようとすると、最初に他のアクションを完了する必要があることを示すグローバルな状態が発生する場合があります。

これを実現するために、次のコードを使用してクラスを作成しました。

private static WeakReference<Activity> oldActivityReference;
private static Intent waitingIntent;

public static void pushActivity(Activity currentActivity, Intent newActivityIntent) {
    Intent blockingIntent = ThisClass.getBlockingActivity();
    if (blockingIntent != null) {
        ThisClass.oldActivityReference = new WeakReference<Activity>(currentActivity);
        ThisClass.waitingIntent = newActivityIntent;
        currentActivity.startActivity(blockingIntent);
        return;
    }
    currentActivity.startActivity(newActivityIntent);
}

ブロッキングアクティビティが終了すると、ThisClass.blockingActivityFinished()が呼び出されます。これにより、古いアクティビティへの弱参照がまだ存在するかどうかが確認され、存在する場合は、そのアクティビティから元のインテントが起動されます。そうでない場合は、アプリケーションのコンテキストから元のインテントを起動します。

私の質問は、
これは正気ですか?この手法で潜在的なメモリリークの問題はありますか?これを達成するためのより良い方法はありますか?

編集-明確にするために、中断をトリガーする可能性のあるイベントのタイプは、1)現在のアプリのバージョンが非推奨であることを示すサーバーping 2)ユーザーの資格情報が無効になったことを示すサーバーRPCです。これらのチェックを処理し、完了したら通常どおりビジネスを再開するために、すべてのアクティビティにロジックを追加したくありません。これはDRYの違反であり、チーム環境ではエラーが発生しやすくなります。

4

1 に答える 1

4

これは正気ですか?

私はこのテクニックを決して使いません。可変の静的データメンバーは、WeakReferenceそれにもかかわらず危険です。特に、ユーザーが考えられないことをして、たとえば自分の電話を電話として使用したり、アプリケーションフローを長期間放置したりすると、これは失敗すると思います。アクティビティが破棄され、プロセスが終了してRAMが解放される可能性がありますが、アクティビティはタスクに残り、再度アクティブ化される可能性があります。その時点で、静力学が弱体化したため、あなたの状態は強打されています。

この手法で潜在的なメモリリークの問題はありますか?

あなたは漏れていIntentます。

これを達成するためのより良い方法はありますか?

この回答の残りの部分では、開始点をアクティビティA、「その他のアクション」をアクティビティB、目的の終了点をアクティビティCと呼びます。したがって、コードでnewActivityIntentは、アクティビティCblockingIntentは、アクティビティB用であり、currentActivityアクティビティAです。

オプション#1:意思決定プロセスをアクティビティAではなくアクティビティCに配置します。アクティビティCに条件をチェックさせ、条件でアクティビティBを表示する必要がある場合はonCreate()、すぐstartActivity()にアクティビティBを呼び出します。

オプション#2:意思決定プロセスをアクティビティAに残しますが、アクティビティCの呼び出しのために、ブール値(たとえば、true「アクティビティBを表示する必要があります」)をIntent追加でstartActivity()渡します。アクティビティCは、ブール値をチェックインしonCreate()、すぐに呼び出しますstartActivity()。ブール値がそう言う場合はアクティビティB。

これらのオプションでは、静力学を回避します。

于 2010-09-10T19:13:22.383 に答える