2011-11-16 26 views
6

Ứng dụng được đề cập đã được triển khai. Tôi đã phát hiện ra khoảng ACRA và sẽ thêm vào đó để tìm hiểu lý do xảy ra sự cố ứng dụng.Lỗi ứng dụng Android, nhưng không khởi động lại - tiếp tục từ một điểm khác trong ứng dụng

Tuy nhiên, vấn đề của tôi là ứng dụng sẽ gặp sự cố (hộp thoại sẽ hiển thị cho bạn tùy chọn "Buộc đóng" hoặc "Đợi"), nhưng thay vì khởi động lại ứng dụng hoàn toàn, ứng dụng sẽ tiếp tục từ điểm trước vụ tai nạn xảy ra. Tuy nhiên, điều này gây ra sự cố, chỉ được khắc phục bằng cách khởi động lại ứng dụng (ví dụ: mất dữ liệu đột ngột, sự cố không có ý nghĩa, v.v.).

Vậy làm cách nào để buộc ứng dụng của tôi, một khi bị lỗi, chỉ kết thúc? (KHÔNG khởi động lại).

Chỉnh sửa: Vấn đề lớn nhất là sau khi ứng dụng gặp sự cố, tất cả dữ liệu trong tệp tùy chọn của tôi sẽ biến mất, cho đến khi ứng dụng được khởi động lại khi quay lại.

+0

Tôi tin rằng những gì bạn đang gặp phải ở đây là 'ANR' hoặc Hoạt động Phản hồi, khác với sự cố ứng dụng (Buộc Đóng). Một số hoạt động trong ứng dụng của bạn dường như đang chặn luồng chính (chuỗi giao diện người dùng) trong một khoảng thời gian nhất định, điều này đang nhắc hộp thoại đóng/chờ. Nếu bạn chọn chờ, ứng dụng sẽ không phản hồi trong phạm vi hoàn thành thao tác đó. Sau đó, ứng dụng sẽ tiếp tục. Nhưng một khi bạn nhấn 'Buộc Đóng', ứng dụng sẽ tắt và khởi động lại khi bạn truy cập vào nó lần sau – Abhijit

+0

Nó không phải là trường hợp ANR, đôi khi nó hiển thị "Buộc Đóng" hoặc "Đợi" là Chuỗi giao diện người dùng bị chặn, nhưng đôi khi nó chỉ là "Đóng quân" để ứng dụng thực sự bị lỗi. Và các ứng dụng không tắt liên tục - trên một số nền tảng nó tắt, nhưng trên những người khác nó chỉ cần tiếp tục từ một điểm trước đó và đã mất tất cả các dữ liệu prefrences. – digerati32

Trả lời

3

Android sẽ khởi động lại hoạt động gần đây nhất theo mặc định. Thay vì buộc phải khởi động lại, chiến lược tốt hơn sẽ là sửa lỗi ứng dụng của bạn, để các hoạt động không bị lỗi hoặc thoát khỏi sự duyên dáng ngay cả khi không có sẵn dữ liệu. Nếu bạn hoàn toàn phụ thuộc vào một số dữ liệu (mục đích bổ sung) và không có mặc định, bạn chỉ có thể gọi finish() nếu không có sẵn hoặc bắt đầu hoạt động chính/phụ huynh.

Một cách khác là có trình xử lý ngoại lệ mặc định của riêng bạn, khởi động lại hoạt động chính, v.v. sau khi báo cáo sự cố bằng ACRA (Tôi tin rằng có yêu cầu tính năng này trong trình gỡ lỗi của ACRA).

+0

Tôi muốn sửa ứng dụng của mình, nhưng tiếc là nó đã được triển khai và tôi đã thêm ACRA để nắm bắt các ngoại lệ ngay bây giờ, nhưng trong trường hợp bất cứ điều gì xảy ra, tôi muốn thoát khỏi ứng dụng một cách mạnh mẽ. Tôi đã kiểm tra ACRA và không thể tìm thấy tính năng đó ...Tôi cho rằng nó chưa được triển khai? – digerati32

+1

Chỉ vì được triển khai không có nghĩa là bạn không thể sửa lỗi và triển khai lại, mọi người sẽ sẵn sàng cập nhật ứng dụng của họ để khắc phục sự cố. –

+0

Tùy thuộc vào phiên bản hệ điều hành nào (hoặc cách nó được thực hiện bởi điện thoại) nó sẽ đóng ứng dụng nếu ứng dụng gặp sự cố. Tôi đã không thể tìm thấy một cách để buộc đóng ứng dụng khi nó bị treo, ngay cả với ACRA. Nhất bạn có thể làm là một vụ tai nạn "yên tĩnh" với ACRA hiện tại, để không có hộp thoại nào xuất hiện. Tôi đã thêm bản cập nhật với ACRA được cài đặt, vì vậy tôi hy vọng sẽ có thể có được lý do cho sự cố và sau đó tôi có thể khắc phục chúng. Tôi sẽ chỉ đánh dấu câu hỏi của bạn là đúng bởi vì câu hỏi gần nhất của nó là đúng ... không có câu trả lời. – digerati32

1

Tôi biết câu hỏi này là một chút cũ, nhưng đối với tài liệu tham khảo và nhân viên của Google trong tương lai, đây là một câu trả lời hoàn chỉnh từ khác, khó có thể tìm thấy, stackoverflow câu hỏi: Android App Restarts upon Crash/force close


tạo ra một lớp sử dụng để xử lý unCaughtException

public class MyExceptionHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final Class<?> myActivityClass; 

    public MyExceptionHandler(Context context, Class<?> c) { 

     myContext = context; 
     myActivityClass = c; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, myActivityClass); 
     String s = stackTrace.toString(); 
     //you can use this String to know what caused the exception and in which Activity 
     intent.putExtra("uncaughtException", 
       "Exception is: " + stackTrace.toString()); 
     intent.putExtra("stacktrace", s); 
     myContext.startActivity(intent); 
     //for restarting the Activity 
     Process.killProcess(Process.myPid()); 
     System.exit(0); 
    } 
} 

Sau đó, trong mỗi chủ đề (thường là bạn chỉ có một, trừ khi bạn bắt đầu một chủ đề mới (hoặc async ..., ofcourse bạn biết về chủ đề nếu bạn có thể làm mới;)), thiết lập lớp này là DefaultUncaughtExceptionHandler

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, 
      YourCurrentActivity.class)); 

Hãy nhớ rằng! Làm điều đó trong bước cuối cùng để phát triển ứng dụng của bạn, bạn CÓ ít nhất hãy thử xử lý tất cả các ngoại lệ của bạn từng cái một trước khi để chúng cho DefaultUncaughtExceptionHandler

+0

chúng ta cần cả ACRA cũng như khởi động lại toàn bộ ứng dụng –

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