2011-09-20 34 views
6

gì Thiết kế-Pattern sẽ là thông minh, trong đó các thành phần sau đây (giản thể) tồn tại:Thiết kế-Pattern cho một dịch vụ như Kiến trúc

3 Components
- GUI
- Dữ liệu fetcher
- Cơ sở dữ liệu

Design

Tôi không có quyền truy cập vào Máy chủ trên Internet, chỉ là Nguồn dữ liệu của nó. Dữ liệu được đặt trong Internet luôn là dữ liệu mới hơn, cơ sở dữ liệu cục bộ chỉ là bản sao (cache) của dữ liệu trên Internet. GUI có thể yêu cầu và cập nhật bộ nhớ cache cục bộ, các thành phần giống như dịch vụ sẽ lấy dữ liệu mới nhất một cách không đồng bộ, có thể mất một thời gian. GUI chỉ hiển thị Dữ liệu từ Cơ sở dữ liệu cục bộ mà bạn có thể tìm nạp đồng bộ.

Vì vậy, Câu hỏi của tôi là, bạn sẽ sử dụng lớp nào cho Dịch vụ chạy dài hạn có khả năng với Progressbar? Có kiểu dáng tốt hơn cho loại "vấn đề" này không? Có thực hành tốt hơn không?

Trả lời

1

Trên Giống như phần Dịch vụ:

  • Một giao diện (phương pháp) để khởi động quá trình cập nhật. Thông thường, dịch vụ này sẽ trả về một jobId để cho biết công việc đang được xử lý trong nền
  • Một giao diện (phương pháp) khác để nhận trạng thái dựa trên một số jobId cụ thể. Việc triển khai dịch vụ này có thể trả lại trạng thái, percentCompleted hoặc bất kỳ thông tin có liên quan nào khác sẽ cho người gọi biết trạng thái hiện tại của quá trình cập nhật. Việc thực hiện phương thức này cần có khả năng báo cáo tiến trình tăng dần (như báo cáo kho lưu trữ gia tăng trong bộ nhớ cục bộ) để tạo thanh tiến trình chính xác, nếu không thì giao diện người dùng tốt nhất có thể hiển thị thanh tiến trình quay.
    • Lưu ý rằng nếu không thể triển khai báo cáo gia tăng thì quá trình cập nhật có thể sử dụng cách sử dụng AsyncTask điển hình thực hiện cập nhật trong nền và báo cáo cho người dùng khi hoàn tất. Nếu hoạt động này có thể mất một lúc, bạn có thể thực hiện hoàn thành cập nhật thông qua thanh thông báo Android hoặc thông báo đẩy.

Giả sử bạn có giao diện để có được sự tiến bộ của bản cập nhật, bạn có thể sử dụng các AsyncTask onProgressUpdate báo cáo tiến độ thực hiện cập nhật. Phương pháp này được thiết kế đặc biệt cho điều đó.

bước của bạn là xấp xỉ như sau:

  • Execute giao diện để cập nhật thông qua một AsyncTask. Vì bản cập nhật của bạn đang diễn ra không đồng bộ, tác vụ cụ thể này sẽ trả về khá nhanh với trạng thái báo cáo liệu thực thi có đang chạy thành công hay không vì một số ngoại lệ cùng với jobId hiện đang thực hiện
  • Khởi chạy AsyncTask khác đang ping trạng thái cập nhật và báo cáo tiến độ qua onProgressUpdate. AsyncTask gần giống như

public class GetUpdateStatusAsyncTask extends AsyncTask { 
    protected Integer doInBackground(Integer... param) { 
     // this is the jobId that you get from the previous AsyncTask that you use to kick off the 
     // the update process 
     int jobId = param[0]; 
     double percentCompleted = fetchStatus(jobId); 

     while(percentCompleted != 100.00) { 
      publishProgress(percentCompleted); 
     } 

     // return status code 
     return 1; 
    } 

    protected void onProgressUpdate(Double... progress) { 
     // set the progressBar here 
    } 

    protected void onPostExecute(Long result) { 
     // done, handle status code 
    } 

    private double fetchStatus(int jobId) { 
     double percentCompleted = 0.0; 
     // call interface to get the update based on the jobId 
     // return percentCompleted status or make a more complex object if you need 
     // more detail info 
     return percentCompleted; 
    } 
} 
+0

có lẽ tôi nên làm rõ bài đăng đầu tiên của mình nhiều hơn. Tôi không truy cập vào Máy chủ trong Internet.Nó chỉ là một nguồn dữ liệu, mới nhất. Tôi lấy dữ liệu và cập nhật cơ sở dữ liệu cục bộ. – kadir

+0

Nếu Service Like Component là một lớp địa phương, để báo cáo tiến độ chính xác, vẫn cần giao diện để có thể có được tiến bộ hiện tại trong lớp này. Nếu không có sẵn giao diện đó, tốt nhất bạn có thể làm là hiển thị thanh tiến trình quay và chờ cho đến khi quá trình cập nhật kết thúc. Tôi sẽ cập nhật câu trả lời – momo

+0

có vẻ tốt nhưng tại sao bạn muốn khởi chạy một asynctask khác để thăm dò ý kiến ​​của tiến trình đầu tiên? – kadir

Các vấn đề liên quan