3

私のonDestroy関数でこのコードを実行しています:

@Override
protected void onDestroy() {
    if (!(null == theUser.glideId)) {
        JSONObject req = new JSONObject();
        try {
            req.put("actionKey", "UserPresenceInactive");
            req.put("userId", theUser.userId);
            new ServerRequest().execute(req); //Run an AsyncTask
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    super.onDestroy();
}

私はAsyncTaskサーバーにリクエストを送信します(200の応答で返されます)。

私の質問は、これを行うことの意味(もしあれば)は何ですか?

アクティビティは破棄されますか?サーバーが応答しない場合、アプリは起動したままでANRに入る可能性がありますか?何かご意見は?

編集

代わりにこれを試してみましたが、android.os.NetworkOnMainThreadException

    new Runnable() {
        @Override
        public void run() {
            JSONObject req = new JSONObject();
            try {
                req.put("actionKey", "UserPresenceInactive");
                req.put("userId", theUser.userId);
                new ServerRequest().execute(req); //Run an AsyncTask
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }.run();

更新#2

Thread代わりに使用Runnableしてトリックを行いました!

4

2 に答える 2

1

はい、Activityは破壊されますが、AsyncTaskはその仕事をしています(バックグラウンドで作業しています)。ANRUIでバックグラウンド処理を行っていないため、何もありません。AsyncTask完了後にUIのビューを更新する場合は、 NULLPOINTER ExceptionAFAIKがあります。ただし、これはでAsyncTaskを実行することはお勧めできませんonDestroy()

于 2012-06-28T10:57:09.800 に答える
1

最善のアプローチは、onDestroy()ではなく、onPause()やonSaveInstanceState()などのメソッドでAsyncTaskを実行することです。

開発者のAndroidリファレンスを見てください:

OnPause():このコールバックは主に、アクティビティが編集している永続的な状態を保存し、「インプレース編集」モデルをユーザーに提示し、最初に新しいアクティビティを開始するのに十分なリソースがない場合に何も失われないようにするために使用されますこれを殺します。これは、次のアクティビティへの切り替えをできるだけ速くしたり、カメラなどの排他的アクセスであるリソースを閉じたりするために、アニメーションの停止やCPUをかなり消費するその他のことを行うのにも適しています。

システムがより多くのメモリを必要とする状況では、リソースを再利用するために一時停止したプロセスを強制終了する場合があります。このため、この関数から戻るまでに、すべての状態が保存されていることを確認する必要があります。一般に、onSaveInstanceState(Bundle)は、アクティビティのインスタンスごとの状態を保存するために使用され、このメソッドは、グローバルな永続データ(コンテンツプロバイダー、ファイルなど)を格納するために使用されます。

于 2012-06-28T11:05:51.393 に答える