2012-04-05 23 views
6

Tôi đang xử lý bất kỳ trường hợp ngoại lệ còn tự do xảy ra trong ứng dụng của tôi qua:Làm thế nào để tôi ngừng ứng dụng của tôi khỏi việc chuộc lại sau khi tôi xử lý một ngoại lệ không bị bắt?

Thread.setDefaultUncaughtExceptionHandler(this); 

là đây là Hoạt động khởi chạy của tôi thực hiện UncaughtExceptionListener. Tôi xử lý các ngoại lệ và gửi nó đến máy chủ đăng nhập của tôi tốt, tuy nhiên, ứng dụng của tôi sau đó không kết thúc. Nó chỉ chạy như một zombie cho đến khi nút home hoặc back được nhấn. Làm thế nào tôi có thể giết quá trình sau khi xử lý ngoại lệ?

Sửa
Dưới đây là một thử nghiệm và hoạt động làm việc đó ném một ngoại lệ còn tự do mà là bị bắt (bởi Thread) và xử lý. Các bánh mì nướng không bao giờ được đăng và quá trình đi zombie một khi ngoại lệ được đăng nhập.

class TestActivity extends Activity implements UncaughtExceptionListener { 

    @Override public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Thread.setDefaultUncaughtExceptionHandler(this); 
     throw new RuntimeException("I'm a destuctive booger."); 

     setContentView(R.layout.activity_test); 
    } 

    @Override public void uncaughtException(Thread thread, Throwable toss) { 
     Log.e(TAG, "An uncaught exception has been recieved.", toss); 
     Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show(); 
    } 
} 
+0

Gọi 'kết thúc()' trong phương thức xử lý. Có thể bạn cũng muốn cung cấp hộp thoại bật lên để thông báo cho người dùng. – Squonk

+0

@MisterSquonk, không thể, ngữ cảnh của tôi bị vô hiệu. Ban đầu tôi có nó nướng một thông báo lỗi quan trọng, nhưng bánh mì nướng sẽ không tạo ra. Sau đó tôi đã thử một máy thu phát sóng và điều đó cũng không hoạt động. – AedonEtLIRA

+1

Xin lỗi, tôi không hiểu. Bạn nói rằng 'this' là launcher của bạn' Activity' vì vậy nếu phương thức handler là một phần của 'Activity', để xử lý nó, bạn phải có 'running'' Activity'. Thực tế là 'Activity' là một lớp con gián tiếp của' Context' có nghĩa là (trong thuật ngữ OOP) một 'Activity' là một' Context'. – Squonk

Trả lời

1

tôi đã làm một số thử nghiệm với mã ví dụ của bạn và khám phá ra rằng finish() sẽ làm việc từ uncaughtException(). Đó là im lặng tuy nhiên do đó không cung cấp bất kỳ thông tin phản hồi cho người dùng và, như bạn, tôi đã không thể gọi một Toast hoặc bất kỳ hộp tin nhắn hình ảnh khác ngay cả khi sử dụng getApplicationContext().

Cách duy nhất để gửi bất kỳ phản hồi nào mà tôi có thể làm việc là sử dụng NotificationManager để gửi thanh trạng thái Notification sử dụng getApplicationContext() cho số Context.

Tôi không dành nhiều thời gian cho nó nhưng tiếc là có vẻ như điều này có nghĩa là phải cung cấp PendingIntent để xử lý khi người dùng nhấp vào thông báo. Làm điều này với cùng một Activity rõ ràng có thể có nguy cơ một vòng lặp vô hạn nếu Activity đặt cho PendingIntent là một trong đó tạo ra một ngoại lệ unhandled.

Tuy nhiên, có thể tạo một khác biệt cơ bản Activity có thể với chủ đề hộp thoại sẽ được mở và giải thích sự cố.

0

Không chắc chắn nếu có một cách nhẹ nhàng để đối phó với vấn đề này, nhưng bạn có thể thử:

import android.os.Process; 

Process.killProcess(Process.myPid()); 
Các vấn đề liên quan