3

ログイン プロセスに関するコードの基本的なアーキテクチャについて、助けが必要です。ICS で動作するように Async Http 処理を実装しています。

このコードの目的は、アプリにログインすることです。

  • UI (Login.java) から送信されたログイン フォーム
  • 私たちのサーバーに接続し、http経由でユーザー名/パスワードを渡し、XML結果を取得します
  • XML 結果を配列に解析します。(ParseXML.java)
  • 結果のフィードバックを UI に表示します。

これですべてがプログラムで機能しましたが、Asyc HTTP 接続を強制する ICS でテストしようとした後、すぐに問題に気づき、設計全体を疑うようになりました...

現在の基本的な動作方法:

ログイン.java:

  class Login {
    ...
    ParseXML myXMLParser = new ParseXML();  
    myXMLParser.doLogin(username, password, Login.this);    

    public doFinished(result) {
      // update UI
    }
    ...
  }

ParseXML.java:

  class ParseXML {
    // class variable to hold login object for async to access
    public Login loginObj;
    ...
    public void doLogin(String _username, String _password, Login _l) {
      loginObj = (Login) _l;
      ...

      // create loginUrl string to run through async
      ...
      new DownloadFilesTask().execute(loginUrl);
    }

    class DownloadFilesTask extends AsyncTask<a, b, c> {
      doInBackground() {
        // do stuff
        // download result of http call
        // parse XML
      }

      onPostExecute(result) {        
        // call the public class variable of login object i have and tell it to update the UI
        // pass back the result array.
        loginObj.doFinished(result);
      }
    }
  }

私は主に、その悪い設計がこのように行われていることを懸念しており、Login.java ファイル内の XML および http 接続コードを移動して、すべてが含まれるようにする必要があります (UI、HTTP、XML 解析、Asyc)。

特に、onPostExecute() から Login.doFinished() にコールバックすることに関心があります。これはメモリに悪いですか?ParseXML オブジェクトがガベージ コレクションを回避するのではないかと心配しています。これは、ユーザーがログインして ParseXML を開いたままにしておくと、ログイン アクティビティが引き続き実行されるためです。

私は PHP のバックグラウンドを持っているので、すべての XML 解析と HTTP 処理をParseXML「モジュール」内に保持して、これに対する変更を探す場所がわかるようにしています。

現時点では、、、、などParseXMLのすべての http 作業を処理しています。しかし、関連する画面/アクティビティ内で XML および HTTP 接続 (非同期) を処理するようにすべてのコードを移動して、自己完結型にする必要がありますか?getUsersgetChannelsaddUserdelUserdoLogin

これについて何か助けていただければ幸いです

4

3 に答える 3

2

この場合はインターフェースを使用します

ダウンロードHelper.java

public interface DownloadHelper 
{
   public void OnDownloadFinish(String Response);
   public void OnDownloadFailed(String Response); 
}

ログイン.java

class Login {

    DownloadHelper helper=new DownloadHelper()
    {
      public void OnDownloadFinish(String Response)
       {
           // update UI

       } 

      public void OnDownloadFailed(String Response)
       {
           //Take Action
       }     
    };  


    new ParseXMLTask(this,helper).execute(username, password);
}

ParseXMLTask.java

class ParseXMLTask extends AsyncTask<Object,Object,Object>
{
    DownloadHelper helper;
    public ParseXMLTask (Context context,DownloadHelper helper)
    {
       this.helper=helper;
    }   
    public void onPreExecute(){}

    public Object DoInBackground(Object object)
    {
       // do stuff
      // download result of http call
     // parse XML
     return parsed response
    }  

   public void onPostExceute(Object object)
    {

       helper.OnDownloadFinish((String)object);
       or
        helper.OnDownloadFailed((String)object);

    }
}
于 2012-06-01T04:53:14.923 に答える
1

あなたの投稿から、結果を表示する LoginActivity に結果を返すために、LoginObject (「LoginCallback」と呼ぶことができますか?) を持つ ParseXML を作成する LoginActivity があると仮定します。これはうまくいくはずです。これはよく使われるコールバック パターンです。コールバックは通常、クラスではなくインターフェイスとして定義されます。

もう 1 つの方法は、LoginActivity で AsyncTask を開始し、その doInBackground で ParseXML を呼び出し、その結果を onPostExecute で LoginActivity に直接返すことです。

于 2012-06-01T04:24:41.293 に答える
1

XML および http 接続コードを Login.java ファイル内に移動して、すべて (UI、HTTP、XML 解析、Asyc) を含める必要があります。

これはまさに、OO 設計で回避しようとしているものです。大きなクラスにはすべて (UI 要素、ビジネス ロジックなど) が含まれています。

要件に基づくと、適切な OO 設計 IMO は次のとおりです。

  1. インターフェイス IBusniessDAO を作成し、すべてのメソッド シグネチャ (getUsers、getChannels など) を定義します。
  2. POJO (AKA. Plain Old Java Object) クラスを作成します。XmlParser は IBusinessDAO を実装します。このクラスでは、メソッドの実装を通常どおり記述し、ここでは非同期実行を処理しません (これはビジネス POJO の仕事ではありません)。これらのメソッドをどこでどのように使用するか (同期または非同期) は、呼び出し元クラス (アクティビティ) で決定されます。将来、XmlParser を JsonParser に置き換えたいと言う場合は、シンプルな create JsonParser で IBusinessDAO を実装し、XmlParser を置き換えます。
  3. AsyncTask は常に (内部クラスとして) Activity にとどまります。Activity がネットワーク機能を必要とする場合は、この Activity で IbusinessDAO オブジェクトを初期化し、AsyncTask.doInBackground() メソッドでネットワーク関連のメソッドを適切に呼び出して、によって管理される UI を更新します。このアクティビティは AsyncTask.onPostExecute() メソッドで直接実行されます。

以前にこの回答で書いたサンプル コードを確認してください。これがお役に立てば幸いです。

于 2012-06-01T05:58:01.420 に答える