2013-09-02 20 views
9

Tôi đang phát triển một ứng dụng Android đang khiến hệ điều hành đóng băng.Cách ứng dụng có thể đóng băng Android OS

Câu hỏi của tôi khá đơn giản nhưng sau khi tìm kiếm dài, tôi không đến gần câu trả lời hơn.

Câu hỏi đặt ra là, làm thế nào một ứng dụng được đặt hộp cát, làm cho toàn bộ hệ điều hành Android (4.0.4, 4.1.1, 4.1.2) đóng băng?

Cụ thể, toàn bộ hệ điều hành bị treo. Không có logcat, không adb, không có gì! Nó là đông lạnh như một hệ điều hành có thể nhận được. Thiết bị này là Samsung Galaxy Tab 2. Ứng dụng sử dụng UsbManager và thư viện từ usb-serial-for-android project. Trong khi thư viện có thể sử dụng NDK, ứng dụng của tôi thì không. Về cơ bản, ứng dụng giao tiếp serially với một bảng thích hợp, nhận dữ liệu và gửi các lệnh nối tiếp. Này được thực hiện trên một sợi công nhân được xử lý theo cách này:

try { 

     thread.interrupt(); 
     thread.join();   
     while(thread.getState() != Thread.State.TERMINATED){ 
       // wait until thread finishes 
     } 

} catch (InterruptedException e) { 
     e.printStackTrace(); 
} 

Tất cả đều hoạt động tốt, có nghĩa là cho đến khi đóng băng xảy ra - khi tôi ngắt kết nối cáp USB hoặc hướng dẫn các đối tượng thư viện để ngắt kết nối. Dù bằng cách nào, toàn bộ hệ điều hành không ổn định và sẽ đóng băng ngay lập tức hoặc khi kết nối lại usb (bảng hoặc máy tính). Tôi đã đăng vấn đề đóng băng này cho dự án usb-serial-for-android nhưng chưa nhận được bất kỳ nhận xét nào. Tôi tin rằng tôi đang làm theo các giao thức thích hợp khi nhả usb.

Tôi hiểu nhiều điều có thể xảy ra - ứng dụng của tôi có thể gặp sự cố. al. Nhưng một lần nữa làm thế nào một ứng dụng sandboxed sụp đổ hệ điều hành - nó không có vẻ là rất sandboxed nếu nó có thể làm điều đó.

CẬP NHẬT

Tôi có sau nhiều thử nghiệm thấy rằng bằng cách loại bỏ các dòng thread.interrupt(); rằng nó hoạt động mà không bị rơi ứng dụng hoặc đóng băng hệ điều hành. Nó vẫn đóng băng hệ điều hành nếu USB được rút phích cắm mà không cần tháo dỡ nó trước.

Tôi vẫn muốn hiểu cách ứng dụng hộp cát có thể đóng băng toàn bộ hệ điều hành. Có những ý kiến ​​ở đây mà lảng tránh một câu trả lời, nhưng không phải là một câu trả lời một mình.

+1

đóng băng, như trong bạn thậm chí không thể về nhà bằng nút home? bạn đang sử dụng trình mô phỏng hay thiết bị thực? nếu bạn sử dụng một thiết bị, thiết bị đó là gì? nếu nó được kết nối với máy tính, logcat nói gì? điều gì xảy ra có thể gây ra đóng băng? – Keale

+1

Nhiều thứ. Bạn sẽ phải cụ thể hơn. –

+1

Tôi sẽ tìm kiếm một vòng lặp chặt chẽ với các điều kiện chấm dứt không hài lòng, hoặc hành vi như tự khởi động lại đệ quy.Vì bạn là * (dĩ nhiên) * bằng cách sử dụng điều khiển nguồn, quay lại phiên bản làm việc đã biết cuối cùng và tiến lên phía trước để tìm những thay đổi nào gây ra sự cố. – andy256

Trả lời

0

Mẫu mã ở trên của bạn nằm ở đâu?

Nó phải nằm trên chuỗi giao diện người dùng, có khả năng chặn tương tác người dùng.

Bạn cũng nhận được thông báo ANR trước khi đóng băng?

thread.join(); 

sẽ chặn vô thời hạn. Xem Thread.join() documentation.

Ngoài ra, phần sau trông giống như một vòng lặp bận rộn với tôi.

Bạn đang làm gì ở nhận xét? Nếu không có gì, vòng lặp sẽ quay như điên (nghĩ while (true) { }).

while(thread.getState() != Thread.State.TERMINATED){ 
      // wait until thread finishes 
    } 
+0

Không ANR chỉ là hệ điều hành đóng băng. Chuỗi công việc được sử dụng để ngăn chặn chặn giao diện người dùng. Như đã nêu trong bài viết, tất cả hoạt động tốt cho đến khi usb bị ngắt kết nối. –

+0

Rất tiếc, tôi đã bỏ lỡ đề cập đến Công nhân của bạn. Dường như [tiêu diệt] (http://developer.android.com/reference/java/lang/Thread.html#destroy()) không còn được dùng nữa. Tôi sẽ bình luận nó. Ngoài ra tham gia có thể chặn, tôi sẽ đề nghị thử tham gia (milli, nano); Cũng đặt trong một kết thúc} bắt (Exception e) {như là một bắt tất cả và bình luận ra toàn bộ vòng lặp trong khi. – stackunderflow

+0

Tôi đã thấy nhiều bài viết đề xuất quá trình chấm dứt chuỗi mà tôi đang sử dụng - bạn không thể giết một chuỗi trực tiếp (bạn có thể nhưng nó không được khuyên), bạn phải nói với nó rằng bạn không còn cần nó nữa ('with join') và chờ đợi - do đó vòng lặp. Tôi đã thử nghiệm này w/o thư viện usb trong một kịch bản của khái niệm chứng minh là rất thành công. Không chờ đợi trong vòng lặp cho đến khi kết thúc thread không được khuyến khích bởi vì phá hủy các đối tượng mà tạo ra nó gây ra các ứng dụng để có được rất không ổn định và ngốc nghếch. –