2012-04-24 14 views
4

私はアンドロイドにアプリケーションを持っています。ここでは、いくつかのREST Webサービスにアクセスしています。私はこれらにアクセスするためにAsyncTasksを使用しており、あといくつかUIの変更を行います。私は、これらの呼び出しのいくつかをさまざまなアクティビティで使用したいと考えています。しかし、私が読んだすべてのチュートリアルによれば、AsyncTasksはアクティビティの内部クラスとして使用されます(これらのアクティビティのビューを変更しているので意味があります)。しかし、どのようにしてAsyncTasksの再利用性を解決できますか?さらに、場所の変更時にAsyncTasks呼び出しをいくつか行いたいとしましょう。私はLocationListener(単一の外部クラス)を持っており、onLocationChange()メソッドの内部でAPI呼び出しを行いたいと思います。しかし私は、私が希望する意見にアクセスすることはできません。なぜなら私はアクティビティクラスにいないからです。誰かがクラスのアーキテクチャーをどうやっていいのか、アイデアがありますか?ありがとうございました。再利用可能なAsyncTasksをアンドロイドで作成するには?

+1

OOの観点から、あなたは再利用可能ではない、再利用可能なビジネス・コンポーネントを作成する必要がありますAsyncTask。詳細については、私の答え[ここ](http://stackoverflow.com/questions/8295003/best-way-to-manage-the-progressdialog-from-asynctask/8317071#8317071)を参照してください。 – yorkw

+0

しかし、あなたが必要なのは、異なるアクティビティでonPostExecute()メソッドを別々に実装する必要があるときに、多くのコードを繰り返すように思えます。 –

+0

IMO AsyncTaskを分離するほうがはるかに優れています。コーディングの複雑さ(コンテキストの参照の受け渡し)を追加するのではなく、実際の利益(再利用可能性、テスト容易性)を得ることができません。 OOの観点からのコードリファクタリングについて言えば、純粋なコードレベルから内部クラス(AsyncTask、BaseAdapterなど)を取り除くのではなく、問題抽象化レベルから多くを考えてください。コードをシンプルにしたい場合は、AsyncTaskコードを維持するsuper Activityの使用を検討してください。AsyncTaskを別のクラスとして作成するよりも優れています。 – yorkw

答えて

4

任意のアクティビティ内で統合するのではなく、別のクラスとして非同期タスクを作成できます。

サンプルコードは:::以下

public class KeyTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     Log.i("onPreExecute", ".onPreExecute() — start"); 


    } 

    @Override 
    protected String doInBackground(Void ... params) { 
     Log.i("TransmissionKeyTask", ".doInBackground() — start"); 

     } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.i("onPostExecute", ".onPostExecute() — start"); 
    }  
} 

であるとも、あなたが以下のようにそれにコンストラクタを追加します::

public KeyTask(Context context) { 
     // TODO Auto-generated constructor stub 

} 
+1

はい、できますが、一部のコンポーネントを変更する必要がある場合は、onPostExecuteメソッドで行う必要があります。タスクがより多様なアクティビティで使用されている場合は、問題になる可能性があります。私はそれがコンテキストのインスタンスをチェックすることによって行うことができると思います(そうですか?)その場合、ユーザーが別のアクティビティにナビゲートしていないかどうかを確認するにはどうすればいいですか? –

+1

enumarationまたはswitch caseのいずれかを使用して、これらのタスクを呼び出す際にコンストラクタを持ち、特定の値を使用して呼び出して区別することができます –

関連する問題