私はここで間違ったトラックにいる可能性があるので、私はこれを見つけ出すために投稿しています。AsyncTaskをn層モデルと組み合わせて使用
私は、データをロードするために多数のサービスリクエストを使用するアンドロイドアプリを開発しています。
Iは、n層のパターン、次の私のコードを配置し:私は開始私の活動からドメイン層(ドメイン)/ Webサービスアクセス層(DAL)/ビジネスロジック層(サービス)/ UI層(UI)
AsyncTask:サービスレイヤーから項目をロードします。アイテムがロードされている間、私は連続的なループ円のアイコンで進行ダイアログを表示します。これはあまりユーザーフレンドリーではないので、進行状況インジケーターを使用して進捗状況を表示したいと思います。
私は自分のdalを簡単に変更できるので、最初に取得するアイテムのIDのリストを取得し、一括で一度に1つずつ取り出します。このようにして、ユーザーに進捗状況を報告することができ、新しい項目(または2つ以上)がロードされるたびにuiを更新します。
問題は私がこれについてどうやって行くのか分からないことです。 AsyncTaskのすべての例は、AsyncTaskを継承するクラス内ですべてが発生し、これがUIスレッドから実行されるという原則に基づいて動作します。
AsyncTaskクラスの定義方法と、データアクセスレイヤーからUIへの進捗状況をどのように報告することができるかについての短いコード例がありますか?
私はすべてのコードをUIに入れても問題はありませんが、それはあまり良い練習ではありません。
私が何をしたいのコード例:どこかMainApplicationで
私が注文のリストを保つ:
public List<Order> orders = null;
私の活動は、AsyncTaskを呼び出して、それを開始します:
OrderActivity.java
public void loadOrdersAsync() {
// Create async task instance
OrderLoaderAsyncTask loader = new OrderLoaderAsyncTask();
// Start loading
loader.doInBackground();
}
OrderLoadAsyncTask.java
public class OrderLoaderAsyncTask extends AsyncTask {
@Override
public Integer doInBackground(Context.... params) {
OrderService service = new OrderService();
MainApplication.orders = service.getAll();
}
@Override
public void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// Update progress bar
updateProgressBar(values);
}
}
OrderService.java私が進行を追跡することができますが、どのように私は私のAsyncTaskにorderslistを構築するためのロジックを移動せずにUIに、この進捗状況を報告します私のサービスに今すぐ
public class OrderService {
public List<Order> getAll() {
// Check to see if we have a cached version
// If we don't, we fetch the orders from REST webservice
OrderRepository repository = new OrderRepository();
// Get list of ID's to fetch
List<Integer> ids = new ArrayList<Integer>;
List<Order> orders = new ArrayList<Order>;
ids = repository.getIDs();
// For each id, fetch order from webservice
for (Integer id : ids) {
Order order = repository.getOneById(id);
orders.add(order);
// Report progress, but how?
}
return orders;
}
}
クラス?サービス層内から進捗状況を報告するにはどうすればよいですか?または私のリポジトリレイヤーからでもですか?
これは少しのリソースを消費しませんか?さらに、私はそれがAsyncTaskの性質に逆らって、そのようにしていると思います... –
これは非常に良い習慣ではないかもしれませんが、私がやりたいことに完全に合っているので、これをよく –
私は、AsyncTaskを何度も作成しなければならないのではなく、AsyncTaskを1回だけ起動できることを覚えておいてください。タイマーを使用すると、定期的にデータソースをポーリングすることができます(サーバー、JDBC接続、名前)。 AsyncTaskのソースコードを見て、ハンドラを使ったタイマーではなく、私がここで説明したものとはそれ程離れていません。 – ruhalde