我想我可能在這裏錯誤的軌道,所以我張貼這個發現。將AsyncTask與n-tier模型結合使用
我正在開發一個使用大量休息服務請求加載其數據的android應用程序。
我安排我的代碼n層圖案下列:域層(域)/ web服務接入層(DAL)/業務邏輯層(服務)/ UI層(UI)
從我的活動餘啓動AsyncTask從服務層加載項目。當物品加載時,我會顯示一個帶有連續循環圖標的進度對話框。這不是非常用戶友好的,所以我想通過進度指示器顯示進度。
我可以很容易地改變我的dal,以便它首先獲取要提取的項目的id列表,然後逐個提取它們,而不是批量提取。這樣我就可以向用戶報告進度,而每次加載新項目(或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
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;
}
}
現在在我的服務,我可以保持進步的軌道,但我怎麼彙報這一進展到UI無需移動邏輯構建orderslist我的AsyncTask類?如何從我的服務層報告進度?甚至從我的存儲庫層?
這不是一個耗時的資源嗎?更進一步說,我認爲這樣做與AsyncTask的性質背道而馳...... –
這可能不是一個很好的做法,但它完全符合我想要做的事情,所以我會接受這種做法好。 –
我已經下定決心了,不需要重複創建一個AsyncTask,記住AsyncTask只能被觸發一次。使用計時器,您可以定期輪詢您的數據源(不管它是什麼,休息服務器,JDBC連接,您的名稱)併發布進度。看看AsyncTask的源代碼,與我在這裏描述的不一樣,而不是他們使用處理程序的定時器。 – ruhalde