2016-09-11 14 views
6

Tôi đã làm một số lượng hợp lý của nghiên cứu và không thể tìm thấy câu trả lời tôi cần.Android - Firebase - Tôi có cần xóa EVERY người nghe duy nhất không?

Những gì tôi KHÔNG biết: Khi tôi đính kèm một ValueEventListener đến một tài liệu tham khảo cơ sở dữ liệu, tôi biết tôi cần phải loại bỏ nó sau này (thấy rằng ra một cách khó khăn bây giờ với một số rò rỉ bộ nhớ khổng lồ

Những gì tôi. KHÔNG biết:? tôi cũng cần phải tách tất cả các thính giả khác (Điều này là bao gồm cơ sở dữ liệu căn cứ hỏa lực, lưu trữ, và Auth, ba API tôi đang sử dụng)

Ví dụ:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(new OnFailureListener() { 
    //@Override code here 
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}).addOnProgressListner(new OnProgressListner<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}; 

Tôi nghĩ điều đó đủ để cho bạn thấy ý nghĩa của ý nghĩa của nó. Đây là cách mã thực sự của tôi hiện được cấu trúc.

Câu hỏi:

  1. Tôi có cần phải loại bỏ tất cả những người nghe chỉ trong trường hợp hoạt động bị chấm dứt (quyết định hệ thống, điện thoại chết, bất cứ điều gì) trước đó callback sẽ xảy ra?
  2. Tôi có thể gộp chúng bằng cách nào đó và chấm dứt cả ba cùng một lúc vì tôi có 30 mã trong số này và thực sự không cảm thấy như sắp xếp lại tất cả để gán tất cả những người nghe này cho biến JUST vì vậy tôi có thể chuyển chúng vào "removeBlahBlahBlahListener (listenerVariable)" hơn và hơn.
  3. Hơi tắt chủ đề, nhưng, tôi quá lười biếng để di chuyển tất cả mã của mình từ onCreate to onStart ... là thực tiễn không tốt cho tôi để xóa tất cả những người nghe này, kết thúc mọi thứ, gọi kết thúc() (hoặc bất kỳ điều gì nó là giết chết một hoạt động, mặc dù tôi đoán điều này không được đảm bảo) và chỉ tạo lại hoạt động từ đầu? Đó là một ứng dụng đơn giản nhỏ nên chi phí của việc tạo lại hoạt động không phải là vấn đề lớn. Chỉ cần tò mò những gì là "đúng".

Tôi tưởng tượng đây chỉ là kết quả của việc lập kế hoạch kém và thiếu kiến ​​thức (tôi chỉ có chương trình cho vui, không phải vì một công việc không may) vì vậy nếu tôi phải đi theo con đường khó, tôi đoán đó là trải nghiệm học tập, ?

+1

Tôi đang nhầm lẫn. Mã ví dụ bạn hiển thị là trình nghe tiến trình cho Bộ nhớ Firebase. Nhưng văn bản của bạn rõ ràng về cơ sở dữ liệu. Bạn đang gặp vấn đề gì? –

+1

Xin lỗi về sự nhầm lẫn Frank. Tôi có thể rõ ràng hơn. Tôi đang sử dụng cả hai API (DB và Storage) từ Firebase và có người nghe trong cả hai. Câu hỏi của tôi thực sự có nghĩa là để áp dụng cho cả hai tôi giả sử. Tôi đoán người nghe Firebase nói chung và khi họ làm và không cần tách ra/gỡ bỏ. Ví dụ, có một số người nghe FB tự chăm sóc bản thân khi hoạt động được di chuyển ra khỏi tầm nhìn hoặc mọi người nghe đơn (DB và Storage) tiếp tục lắng nghe ngay cả sau onPause/Stop/Destroy vv – Ryan

Trả lời

4

Tự động hủy đăng ký người nghe khi một hoạt động dừng lại là một tính năng trên lớp "Tác vụ" trong Android và các lớp dẫn xuất của nó (StorageTask).

Điều này có nghĩa bạn có thể làm một cái gì đó như thế này:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(thisActivity, new OnFailureListener() { 
//@Override code here 
}).addOnSuccessListener(thisActivity, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
//@Override code here 
}).addOnProgressListner(thisActivity, new OnProgressListner<UploadTask.TaskSnapshot>() { 
//@Override code here 
}; 

Bạn cũng có thể làm điều này với công tác đối tượng trở về từ cơ sở dữ liệu thời gian thực như setValue như trong:

databaseReference.setValue("newValue").addOnSuccessListener(thisActivity, ...) 

Vì vậy, để trả lời của bạn câu hỏi trực tiếp:

  1. Sử dụng phiên bản phạm vi hoạt động để tự động hủy đăng ký người nghe dừng hoạt động. Lưu ý rằng để lưu trữ, bạn có thể truy vấn các hoạt động đang chạy khi hoạt động của bạn bắt đầu sử dụng StorageReference.getActiveUploadTasks và StorageReference.getActiveDownloadTasks và đăng ký lại.

  2. Bạn không cần hủy đăng ký theo cách thủ công nếu sử dụng trình lắng nghe bị nhiễu. Tôi không biết cách hủy đăng ký hàng loạt đối với người nghe không dựa trên nhiệm vụ. Vâng, tôi không chắc chắn làm thế nào bạn có thể đảm bảo rằng hệ điều hành sẽ luôn luôn giết nhiệm vụ của bạn thay vì dừng/khởi động lại nó - và làm thế nào mã kết thúc của bạn sẽ được đảm bảo để chạy. Tôi khuyên bạn nên chuyển mã sang onStart

+0

Rực rỡ! Cảm ơn bạn. Câu trả lời xuất sắc và chính xác những thông tin tôi đang tìm kiếm. Vì vậy, nơi bạn đặt "thisActivity" trong các ví dụ lưu trữ, là giống như nếu tôi đặt "này" hoặc không "này" mô tả một cái gì đó khác hơn là hoạt động? Tôi thấy tôi có thể làm "this.getCallingActivity" và một vài thứ khác. Bạn có thể cho tôi biết cách thích hợp để tham khảo hoạt động này vì vậy tôi không kết thúc việc tham khảo cái gì khác? Ngoài ra, tôi sẽ đưa ra lời khuyên của bạn và di chuyển một số logic onCreate() của tôi đến onStart(). Nó đáng lẽ phải ở đó để bắt đầu. Học bài học một cách khó khăn! ;) – Ryan

+2

thường "này" đề cập đến hoạt động trong khi bên trong mã của một hoạt động. Nó có thể không, tuy nhiên, nếu bạn đang ở trong một lớp lồng nhau hoặc thường xuyên gọi lại. Nếu bạn thấy mình ở đó, bạn có thể tham khảo cụ thể hoạt động bằng cách đủ điều kiện "này" với một loại - như trong "MainActivity.this" –

+0

rằng nhận xét cuối cùng chỉ đặt đóng băng trên bánh. rò rỉ bộ nhớ được giải quyết :) – Ryan

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