2012-04-12 40 views
5

Tổng quan: Mở các kết nối db trong onStart và trong các tác vụ không đồng bộ đã trở nên khá phức tạp. Thực tiễn không tốt để có kết nối db có sẵn trên toàn cầu? Nếu nó là xấu một cách tốt hơn là gì?Android khi nào tôi nên mở và đóng kết nối db?

Chi tiết: Tôi có một ứng dụng kết nối với cơ sở dữ liệu sqlite3 trong một số hoạt động. Lúc đầu không có nhiều nơi tôi cần truy cập cơ sở dữ liệu nên tôi chỉ mới mở và đóng mỗi khi tôi cần truy cập. Sau đó, có nhiều nơi cần truy cập nó hơn, như được đề xuất trên một câu hỏi Stack Overflow khác, tôi bắt đầu mở các kết nối cơ sở dữ liệu trong phương thức onStart của hoạt động cần kết nối và đóng nó trong phương thức onStop.

Điều này làm việc tốt cho đến khi tôi bắt đầu cần kết nối trong một số tác vụ không đồng bộ đã làm sống động hoạt động. Vì phương thức onStop cho hoạt động đã được gọi và các kết nối đã bị đóng, do thời gian tác vụ không đồng bộ cố gắng truy cập cơ sở dữ liệu mà nó đã thất bại. Là một giải pháp, tôi đã tạo các kết nối riêng biệt cho mỗi tác vụ không đồng bộ được mở trong phương thức onPreExecute và được đóng trong phương thức onPostExecute.

Điều này đã dẫn đến rất nhiều mở và đóng kết nối, và tôi tự hỏi nếu tạo kết nối db có sẵn trên toàn cầu trong ngữ cảnh ứng dụng là một ý tưởng hay. Nó chắc chắn sẽ dọn sạch rất nhiều mã và loại bỏ bất kỳ ngoại lệ db không được tiết lộ nào đang xảy ra nếu tôi quên đóng kết nối hoặc ứng dụng đóng một lực. Bất kỳ ai khác đã thử điều này/thấy bất kỳ vấn đề với cách tiếp cận này?

+0

Đây là thực hành tốt, hãy làm. Vấn đề chính cần tránh là rò rỉ bộ nhớ từ việc sử dụng ngữ cảnh ứng dụng, đây không phải là vấn đề nếu nó chỉ dành cho các hoạt động cơ sở dữ liệu. – stealthcopter

Trả lời

2

Tôi đã gặp phải sự cố tương tự vài tuần trước. Tôi sử dụng một số lớp có sự tồn tại trong một db SQLite.

Vì tôi muốn tách các hoạt động khỏi sự bền bỉ, tôi đã tạo các lớp bên trong tĩnh (được gọi là Người quản lý) cho những người cần sự kiên trì. Mỗi lần tôi khởi tạo Trình quản lý, một kết nối db được tạo và sau khi sử dụng trình quản lý, tôi đóng nó một cách rõ ràng. Nếu tôi có các nhà quản lý toàn cầu truy cập vào các bảng, chúng sẽ được đồng bộ do đồng thời và tôi không biết khi nào tôi nên đóng các kết nối db đó. Vì vậy, tôi đã làm theo cách này.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn, đã không suy nghĩ về vấn đề đồng thời, đây là những gì tôi đang tìm kiếm. – odiggity

+0

Bạn được hoan nghênh! Vui mừng được giúp đỡ! :) – Caumons

2

Bạn có thể tạo một BaseAsyncTask có onPreExecute() và onPostExecute() chịu trách nhiệm mở và đóng kết nối db.

AsyncTasks có thể mở rộng cuộc gọi BaseAsyncTask super.onPreExecute() và super.onPostExecute() và thực hiện tải dữ liệu thực tế trong phương thức doInBackground().

+0

Đã phải chấp nhận câu trả lời khác vì nó trả lời tốt hơn câu hỏi của tôi, nhưng tôi chắc chắn sẽ làm điều này. Cảm ơn! – odiggity

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