2011-07-07 15 views
1

私はアンドロイド開発には初めてです。UIを扱うAndroid非同期タスク

  • 外部クラスを呼び出す(他のクラスは、AsyncTaskを拡張するであろう)xmlを解析し、Webサービスに要求することによってjsonを受信し、ProgressDialogを開始メインactivty:私は次のように説明したタスクを達成したいです。
  • クラスはdoInBackgroundメソッドでxmljsonを解析します。
  • 構文解析が完了した後にonPostExecuteメソッドで、メインアクティビティに設定されたProgressDialogを却下します。
  • ProgressDialogオブジェクトを解析クラスに渡し、同じオブジェクトをそのonPostExecuteメソッドで破棄することで、これを行うことができます。

私は、引数としてUIオブジェクトのインスタンスを渡すことはプログラムへの良いアプローチではないと思いますが、回避するには別の方法が必要であることを願っています。

お勧めします。 が

答えて

4

これらを分離する最も簡単な方法は、インターフェイスを使用することですありがとう:

  1. はコールバックインタフェースを定義し、単一の方法で(のはそれWorkDoneListenerを呼びましょう):workDone()
  2. アクティビティクラスを宣言してWorkDoneListenerを実装し、workDone()を実装してダイアログを閉じます。
  3. WorkDoneListenerを受け入れるAsyncTaskのコンストラクタを定義します。参照をメンバーフィールドに隠します。
  4. onPostExecuteには、リスナーのworkDone()メソッドを呼び出します。
+2

+1 :)理論的には、彼は依然として「AsyncTaskにインスタンスを渡す」と言います。 OPがインスタンス全体をコピーするという印象を受けているのだろうか? – JustDanyul

+2

良い点。 Javaのこのような呼び出しの場合と同様に、インスタンスはコピーされません。どちらも良いことと悪いことです。正当な理由がないのにオブジェクトを作成しないためです。これはメモリリークの原因となる可能性があります。特に、アクティビティを殺すような構成変更の場合に非同期タスクが引き続き動作する必要がある場合に発生します。 –

+1

参照がクリアされていない場合は、元のアクティビティとすべてのビューがオリエンテーションスイッチでリークします。アクティビティが死にかけているときには、このケースを処理し、アクティビティが再作成された時点で切り離して再接続する必要があります。 – dmon

1

AsyncTaskが大きすぎて他のファイルに宣言したい場合は、Tedの回答が必要です。ただし、通常はあなたのUIクラス内AsyncTaskを宣言することに注意してください:実際には

public class YourActivity extends Activity{ 
    private class YourAsyncTask extends AsynkTask<etc.>{ 
    } 
} 

、あなたはあなたのAsyncTaskを使用している場合は、その活動からのみ(あなたはどこにもそれを使用していない場合、私は、意味)、 AsyncTaskを内部クラスとして宣言することは、良い設計の習慣です。

関連する問題