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">“CrashHandler”</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">“uncaughtException”</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">“提示”</span>).setCancelable(<span class="keyword">false</span>)
- .setMessage(<span class="string">“程序崩溃了…”</span>).setNeutralButton(<span class="string">“我知道了”</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(“提示”)</span>
- <span class="comment">// .setMessage(“程序崩溃了…”).setNeutralButton(“我知道了”, 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/ | 萝卜白菜的博客
💬 评论