SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

IntentService đang đóng băng giao diện người dùng ứng dụng của tôi

Bạn có chắc chắn rằng đó là IntentService không đó là nguyên nhân gốc rễ của việc đóng băng giao diện người dùng? Các dịch vụ Intent được thiết kế đặc biệt để chạy trong các chuỗi công nhân nhằm giảm tải quá trình xử lý từ chuỗi chính (Giao diện người dùng), với một trong những lý do chính cho việc này là giúp ngăn chặn Giao diện người dùng bị đóng băng.

Có lẽ hãy thử bắt đầu các nỗ lực gỡ lỗi của bạn ở cấp giao diện người dùng. Cụ thể, những gì cung cấp ResultReceiver tới IntentService khi bạn khởi động nó và bạn làm gì trong onReceiveResult phương thức gọi lại trong trường hợp người nhận đó?

Ngoài ra, đối với hoạt động mà bạn đang gặp phải tình trạng đóng băng, hãy kiểm tra loại hoạt động bạn đang thực hiện. Đang tải một lượng lớn dữ liệu từ cơ sở dữ liệu trên chuỗi chính (tức là không sử dụng Loader hoặc một cái gì đó tương tự như giảm tải quá trình xử lý cho một chuỗi công nhân) là nguyên nhân phổ biến của việc đóng băng giao diện người dùng, ít nhất là theo kinh nghiệm của tôi cho đến nay.

Cập nhật

Tôi nghĩ rằng tôi đã tìm ra vấn đề là gì. Có hai vấn đề chính, cả hai đều bắt nguồn từ cách bạn đang sử dụng Volley. Khi bạn thêm một yêu cầu vào hàng đợi Volley, nó sẽ được thực thi không đồng bộ. Điều đó có nghĩa là queue phương thức trả về ngay lập tức. Trong mã dịch vụ ý định của bạn, điều này có nghĩa là dịch vụ ngay lập tức tiếp tục thông báo cho ResultReceiver rằng nó đã hoàn tất quá trình xử lý, khi thực sự tất cả những gì nó đã làm là xếp hàng yêu cầu. Tất cả các dịch vụ năm mục đích sẽ thực hiện điều này, có nghĩa là MainActivity sẽ được nhập vào rất nhanh chóng. Đây là vấn đề đầu tiên.

Vấn đề thứ hai giải thích tình trạng đóng băng mà bạn đang gặp phải. Mặc dù Volley thực thi các yêu cầu trên các luồng công nhân, nó trả về các phản hồi đã được phân tích cú pháp cho các yêu cầu trên luồng chính - xem tài liệu tại đây. Điều này có nghĩa là tất cả quá trình xử lý phản hồi mà bạn đang thực hiện trong dịch vụ dự định (đưa dữ liệu vào cơ sở dữ liệu, v.v.) đang thực sự diễn ra trên chuỗi chính (UI). Điều này giải thích cho việc đóng băng.

Điều bạn có thể muốn làm ở đây là chuyển sang sử dụng RequestFuture của Volley thay thế. Điều này về cơ bản biến một yêu cầu không đồng bộ thành một yêu cầu đồng bộ bằng cách cho phép bạn chặn cho đến khi yêu cầu kết thúc. Để thực hiện việc này, hãy tạo tương lai của loại thích hợp (JSONObject trong trường hợp của bạn) và đặt nó làm cả người nghe và người nghe lỗi cho yêu cầu. Sau đó, xếp hàng yêu cầu như bạn đang làm và ngay sau đó cuộc gọi gọi get phương pháp về tương lai. Phương thức này sẽ chặn cho đến khi phản hồi được xử lý xong. Bạn có thể thực hiện việc này trong một dịch vụ có ý định vì nó chạy trên chuỗi công nhân, không phải chuỗi giao diện người dùng.

Nếu yêu cầu thành công, bạn sẽ nhận được dữ liệu được trả về và bạn có thể thực thi tất cả logic hiện có trong Response.Listener của bạn thực hiện. Nếu xảy ra lỗi (tức là yêu cầu không thành công vì lý do nào đó), yêu cầu trong tương lai sẽ đưa ra một ngoại lệ mà bạn có thể xử lý để thực hiện bất kỳ hành động thích hợp nào.

Sử dụng tương lai yêu cầu là một cách tiếp cận hoàn toàn khác để sử dụng trình nghe và bạn có thể cần phải thay đổi mã của mình một chút để mã hoạt động, nhưng nó sẽ giải quyết được các vấn đề mà bạn đang gặp phải.

Hy vọng điều đó sẽ hữu ích và tôi xin chân thành xin lỗi vì đã không tìm ra lỗi sớm hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các hàm &toán tử JSON trong SQLite (Danh sách đầy đủ)

  2. SQLite FULL OUTER JOIN Giả lập

  3. Phòng cách tốt nhất để tạo bản sao lưu cho ứng dụng ngoại tuyến?

  4. Chỉ nâng cấp hàng khi nâng cấp ứng dụng

  5. Làm cách nào tôi có thể đọc dữ liệu từ một DB được mã hóa bằng SQLiteAssetHelper?