2014-04-10 20 views
10

Belirli senaryodan kaldırdı genel bir soru, ama ben nasıl aşağıdaki durumla başa çıkmak için genel bir cevap almak istiyorum:Arka plan iş parçacığında istisna nedeniyle android uygulaması nasıl engellenir?

Geçmiş:

ben bir uygulama olduğunu var (- özellikle - AdMob SDK, Google Play Services dayalı reklam ağı sağlayıcısı SDK) bazı 3. parti kitaplığı kullanarak. Bu kütüphanenin işlevselliği uygulama için kritik değildir. Kütüphane bir veya daha fazla arka plan çalışan iş parçacığı oluşturur. Bazen (çok nadir durumda), bu arka plan iş parçacıklarının birinde işlenmeyen bir istisna vardır ve bu da uygulamanın çökmesine neden olur. Ben ne olursa olsun nedeni, bu kütüphaneye neden olduğu tüm istisnaları, dikkate almak istemediğiniz: en kötü durumda uygulama kullanıcısı bir reklam görmezsiniz - bu uygulama kilitlenmesiyle çok daha iyidir. kütüphane kendisi arka plan konuları oluşturur yana

- Sadece try/catch bunları sarmalayamazsınız.

Soru

(ana olmayan) iplik istisnalar dışındaki tüm saplı arka plan yakalamak için herhangi bir yolu var mı ve böyle durumda iplik öldürmek ve uygulama kazasında önlemek için?

İlgili sorular

geliştirici iplik oluşturma bir kontrole sahip ve ne zaman, diğerleri duruma bakın ben birkaç soru çok gördük, ama bazıları çok özeldir (ve davamı kapsayan değil) Tüm ipliği try/catch ile sarmak mümkün. Hala bu davayı kapsayan, ilgili soruyu cevapsız, ben yapmanız gereken tüm BaseActivity ile tüm faaliyetleri uzatın olan bağlantıyı

+2

Eğer işçi iş parçacığı için bir işleyici yükleyerek denediniz değil deneyin süreci öldürmek sınıf oluşturun? Bunun mümkün olup olmadığını bilmiyorum çünkü çökmekte olan çalışan iş parçacığına erişemeyebilirsiniz. Biliyorum flurry tüm süreç için bir işleyici yüklemek ve uygulama çöker önce bir hata raporu iletmek için yönetir biliyorum. Belki bu yolla yapılabilir. –

+0

@over_optimistic Teşekkürler! Thread.setDefaultUncaughtExceptionHandler kullanmayı denedim ve bir çekicilik gibi çalışıyor :)! Ben kabul edebilir böylece cevap olarak bu yazınız o –

+1

http://stackoverflow.com/questions/2764394/ideal-way-to-set-global-uncaught-exception-handler-in-android/ – fadden

cevap

12

takdir edecektir. Uygulamanın asla BaseActivity için herhangi bir noktasında

Kod sniplet de çöküyor: Yukarıda belirtildiği gibi

public class BaseActivity extends Activity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
      public void uncaughtException(Thread paramThread, Throwable paramThrowable) { 
       Log.e("Error"+Thread.currentThread().getStackTrace()[2],paramThrowable.getLocalizedMessage()); 
      } 
     }); 
    } 
} 
+0

bunu koymak daha iyi olduğunu düşünüyorum özel Uygulama sınıfa bu kod, benim app siyah ekranda stucks bunu çöküyor zaman benim uygulamasına, bu ekledikten sonra bir uygulamanın ömrü –

+1

sadece bir kez çalıştırmak için tasarlanmıştır beri. Lütfen bana yardımcı ol –

2

, Thread.setDefaultUncaughtExceptionHandler bu işlemek için uygun bir yoldur.

private class MyThreadUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 

    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
     Log.e(TAG, "Received exception '" + ex.getMessage() + "' from thread " + thread.getName(), ex); 
    } 
} 

Ardından ana iş parçacığı gelen setDefaultUncaughtExceptionHandler çağırır:

Thread t = Thread.currentThread(); 
t.setDefaultUncaughtExceptionHandler(new MyThreadUncaughtExceptionHandler());