2014-04-10 48 views
10

這是一個普遍的問題,它從特定的場景中長大,但我希望得到一個籠統的回答如何應對以下情況:如何防止由於後臺線程中的異常導致android應用程序崩潰?

背景:

我有一個應用程序,這是使用一些第三方庫(廣告網絡提供商SDK - 具體 - AdMob SDK,基於Google Play Services)。該庫的功能對於應用程序並不重要。該庫創建一個或多個後臺工作線程。有時(非常罕見的情況下)其中一個後臺線程中存在未處理的異常,導致應用程序崩潰。我想忽略由此庫引起的所有異常情況,無論其原因如何:最糟糕的情況是應用用戶看不到廣告 - 這比應用崩潰要好得多。

由於庫本身創建後臺線程 - 我不能只通過try/catch來包裝它們。

問題

有沒有辦法捕捉所有非處理的背景(非主)線程的例外,只是要殺死在這種情況下,螺紋,並防止應用程序崩潰?

相關問題

我看到了很多的幾個問題,但有些過於具體(而不是覆蓋我的情況),其他參考的情況時,開發商對線程創建一個控制,是能夠用try/catch包裹整個線程。如果我仍然錯過了相關的問題,我將很感激鏈接

+2

您是否嘗試過安裝的處理程序工作線程,並儘量不要殺死進程?我不知道這是否可能,因爲您可能無法訪問正在崩潰的工作線程。我知道flurry設法爲整個過程安裝一個處理程序,並在應用程序崩潰之前傳輸錯誤報告。也許通過這條路線是可行的。 –

+0

@over_optimistic謝謝!我嘗試使用Thread.setDefaultUncaughtExceptionHandler,它的作用就像一個魅力:)!請把這個寫成答案,我可以接受它 –

+1

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

回答

12

您只需使用BaseActivity擴展所有活動即可。該應用程序崩潰從來沒有在任何時候

代碼爲sniplet BaseActivity:

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

我認爲最好把這段代碼放入自定義應用程序類中,因爲它只是在應用程序的生命週期中運行一次 –

+1

,然後將其添加到我的應用程序中,每當我的應用程序崩潰時它就會在黑屏上進行掃描。請幫助我 –

2

如上所述,Thread.setDefaultUncaughtExceptionHandler是來處理這個正確的方式。創建類:

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); 
    } 
} 

然後調用是,setDefaultUncaughtExceptionHandler從你的主線程:

Thread t = Thread.currentThread(); 
t.setDefaultUncaughtExceptionHandler(new MyThreadUncaughtExceptionHandler()); 
相關問題