Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。

1、异常处理类,代码如下:

**[java]** [view plain](http://blog.csdn.net/hehe9737/article/details/7662123#)[copy](http://blog.csdn.net/hehe9737/article/details/7662123#)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> <span class="keyword">class</span> CrashHandler <span class="keyword">implements</span> UncaughtExceptionHandler {

- <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> String TAG = <span class="string">&#8220;CrashHandler&#8221;</span>;

- <span class="keyword">private</span> <span class="keyword">static</span> CrashHandler INSTANCE = <span class="keyword">new</span> CrashHandler();

- <span class="keyword">private</span> Context mContext;

- <span class="keyword">private</span> Thread.UncaughtExceptionHandler mDefaultHandler;

- 
- <span class="keyword">private</span> CrashHandler() {

- }

- 
- <span class="keyword">public</span> <span class="keyword">static</span> CrashHandler getInstance() {

- <span class="keyword">return</span> INSTANCE;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> init(Context ctx) {

- mContext = ctx;

- mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

- Thread.setDefaultUncaughtExceptionHandler(<span class="keyword">this</span>);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> uncaughtException(Thread thread, Throwable ex) {

- <span class="comment">// if (!handleException(ex) && mDefaultHandler != null) {</span>

- <span class="comment">// mDefaultHandler.uncaughtException(thread, ex);</span>

- <span class="comment">// } else {</span>

- <span class="comment">// android.os.Process.killProcess(android.os.Process.myPid());</span>

- <span class="comment">// System.exit(10);</span>

- <span class="comment">// }</span>

- System.out.println(<span class="string">&#8220;uncaughtException&#8221;</span>);

- 
- <span class="keyword">new</span> Thread() {

- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> run() {

- Looper.prepare();

- <span class="keyword">new</span> AlertDialog.Builder(mContext).setTitle(<span class="string">&#8220;提示&#8221;</span>).setCancelable(<span class="keyword">false</span>)

- .setMessage(<span class="string">&#8220;程序崩溃了&#8230;&#8221;</span>).setNeutralButton(<span class="string">&#8220;我知道了&#8221;</span>, <span class="keyword">new</span> OnClickListener() {

- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onClick(DialogInterface dialog, <span class="keyword">int</span> which) {

- System.exit(<span class="number"></span>);

- }

- })

- .create().show();

- Looper.loop();

- }

- }.start();

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑</span>

- <span class="comment">     *</span>

- <span class="comment">     * @param ex</span>

- <span class="comment">     * @return true:如果处理了该异常信息;否则返回false</span>

- <span class="comment">     */</span>

- <span class="keyword">private</span> <span class="keyword">boolean</span> handleException(Throwable ex) {

- <span class="keyword">if</span> (ex == <span class="keyword">null</span>) {

- <span class="keyword">return</span> <span class="keyword">true</span>;

- }

- <span class="comment">// new Handler(Looper.getMainLooper()).post(new Runnable() {</span>

- <span class="comment">// @Override</span>

- <span class="comment">// public void run() {</span>

- <span class="comment">// new AlertDialog.Builder(mContext).setTitle(&#8220;提示&#8221;)</span>

- <span class="comment">// .setMessage(&#8220;程序崩溃了&#8230;&#8221;).setNeutralButton(&#8220;我知道了&#8221;, null)</span>

- <span class="comment">// .create().show();</span>

- <span class="comment">// }</span>

- <span class="comment">// });</span>

- 
- <span class="keyword">return</span> <span class="keyword">true</span>;

- }

- }

2、线程绑定异常处理类

**[java]** [view plain](http://blog.csdn.net/hehe9737/article/details/7662123#)[copy](http://blog.csdn.net/hehe9737/article/details/7662123#)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> <span class="keyword">class</span> CrashHandlerActivity <span class="keyword">extends</span> Activity {

- <span class="comment">/** Called when the activity is first created. */</span>

- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) {

- <span class="keyword">super</span>.onCreate(savedInstanceState);

- setContentView(R.layout.main);

- CrashHandler crashHandler = CrashHandler.getInstance();

- crashHandler.init(<span class="keyword">this</span>);  <span class="comment">//传入参数必须为Activity,否则AlertDialog将不显示。</span>

- <span class="comment">// 创建错误</span>

- <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();

- }

- }

**Demo下载地址:**http://code.google.com/p/android-custom-view/downloads/list

转载地址: http://orgcent.com/android-uncaughtexceptionhandler-exception/ | 萝卜白菜的博客

 

💬 评论