2

いくつかのアクティビティでインターフェイス (NetworkListener と呼ばれる) を実装しています。リモート サーバーから情報を要求すると、クラスのインスタンス (NetworkRequest と呼ばれます) が生成されます。NetworkRequest は、要求をサーバーに送信し、応答を待って、要求元の NetworkListener オブジェクトに送り返すスレッド化されたクラスです。データが NetworkListener インスタンスに返されるまでに最大 10 秒かかる場合があります。その間、そのアクティビティまたはフラグメントが存在しなくなり、サーバー呼び出しに基づく多くのアクションが無効になり、次のような NPE がスローされる可能性が十分にあります。

((TextView) findViewById(R.id.server_status)).setText("Server response: " + response.getMsg());

要求しているクラスがまだ生きていて、UI を更新できるようにする最善の方法は何ですか?

現在、私が持っているサーバーからコールバックを受け取るすべてのメソッドの上部にあります:

if (getWindow() == null) {  // or getView()/getActivity() if Fragment
            finish();
            return;
        }

これは非効率的で冗長なようです。私が達成しようとしていることに対するより良い方法はありますか?

ありがとう!

4

2 に答える 2

1

アクティビティ/フラグメントのロジック チェック状態を NetworkRequest に移動できます。isActive() メソッドを NetworkListener インターフェイスに追加します。NetworkListener がアクティブな場合にのみ、NetwrokRequest は NetworkListener に応答を送信します。

onCreate() -> active および onDestroy() -> inactive でアクティビティ/フラグメントのアクティブ性を設定できます。

画面を回転させたときなど、アクティビティの状態が変化することに注意してください。次に、サーバーの応答を取得しない新しいアクティビティを取得します。これは、必要なものではない可能性があります。

于 2012-08-28T08:07:27.420 に答える
0

AsyncTask を使用して、ネットワーク リクエストを実行できます。リクエストが不要になったら、AsyncTask をキャンセルできます。

于 2012-08-26T13:08:43.057 に答える