2012-01-17 31 views
5

Tôi có một Dịch vụ tìm nạp một số dữ liệu từ web và cập nhật Danh sách được "lưu trữ" trong Ứng dụng.Thực hành tốt nhất: Cập nhật ArrayAdapter liên tục

Vì vậy, tôi có thể truy cập nó từ hoạt động chính và sử dụng nó cho ArrayAdapter của tôi.

Khi tôi cập nhật dữ liệu, mục được tham chiếu từ danh sách được thay đổi.

Câu hỏi của tôi là, cách thực hành tốt nhất để cập nhật dữ liệu trong Bộ điều hợp trong hoạt động chính là gì?

Tôi có hai giải pháp trong đầu, nhưng tôi không biết liệu chúng có đúng theo cách đó hay không. Thêm vào đó, tôi muốn thực hiện một phiên bản mà không sử dụng nhiều pin!

đầu tiên: Chủ đề được gọi là mỗi giây, cập nhật Adapter với notifyDataSetChanged():

private void startListUpdateThread() 
{ 
    Thread ListManageThread = new Thread() { 
     LinkItem listItem; 
     public void run() { 
      Log.d("DL", "List Update - start"); 
      while(true) 
      { 
       runOnUiThread(UpdateGUIList); 

       try { 
        Thread.sleep(1000); //5Sekunden! 
       } 
       catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Log.e("DL", "ERROR: InterruptedException - " + e.getMessage()); 
       } 
      } 
     } 
    }; 
    ListManageThread.start(); 
} 

private Runnable UpdateGUIList = new Runnable() { 

    @Override 
    public void run() { 
     mFileAdapter.notifyDataSetChanged(); 
    } 
};  

thứ hai: Sử dụng một Handler bài chậm tin handler Handler thức = new Handler();

private void startListUpdate() 
{ 
    handler.removeCallbacks(UpdateListUI); 
    handler.postDelayed(UpdateListUI, 1000); // 1 second 

} 

private Runnable UpdateListUI = new Runnable() { 
    public void run() { 
     //Remove Elements first 
     removeDeletedItemsFromList(); 

     //Update Adapter 
     mFileAdapter.notifyDataSetChanged(); 

     handler.postDelayed(this, 1500); // 1,5 seconds 
    } 
}; 

Vì vậy, cách tốt nhất để làm điều đó là gì? Có lẽ cũng có một cách khác để làm điều đó, nhưng trong đó tôi đã không nghĩ đến trước đây!

Trả lời

1

Thay vì sử dụng trình xử lý, bạn sẽ sử dụng tác vụ Không đồng bộ. Mặc dù trình xử lý hoạt động ở đây nhưng đó là khái niệm JAVA và Async Task là Android.

Và bạn có thể cập nhật chế độ xem danh sách bằng cách sử dụng: mFileAdapter.notifyDataSetChanged(); chỉ đúng thôi.

+0

Hãy sửa tôi nếu tôi sai, nhưng theo quan điểm của tôi, Nhiệm vụ Async chịu trách nhiệm cho một tác vụ đang chạy nhanh và cần cập nhật _during_ hoặc _after_ công việc đã hoàn tất. – Webchen

0

Thay vì sử dụng HandlerThread bạn có thể sử dụng AlarmManager. Chỉ cần bắt đầu báo động một lần và nó sẽ cập nhật danh sách của bạn với khoảng thời gian xác định khoảng thời gian mà không có bất kỳ chủ đề hoặc xử lý. Bạn đã tạo một dịch vụ và bạn có thể tham chiếu đến dịch vụ đó bằng cách sử dụng AlarmManager.

AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(arg0, TestService.class); 
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0); 
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi); 

Và trong số TestService bạn có thể có mã để cập nhật Danh sách của mình.

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