zoukankan      html  css  js  c++  java
  • android 全局异常的处理 详解

    Android游戏《歪把子炮》源码
    http://www.eoeandroid.com/thread-197425-1-1.html

    Android 新版捕鱼达人源码
    http://www.eoeandroid.com/thread-197437-1-1.html

    Android版本的手机RSS阅读器的源码
    http://www.eoeandroid.com/thread-197465-1-1.html

    最近新产品测试,频频出现异常。所以需要对异常进行全局捕捉。
    翻阅大量帖子、源码终于找到了UncaughtExceptionHandler接口。废话不多说还是直接上源码吧。


    首先实现UncaughtExceptionHandler

    public class CatchHandler implements UncaughtExceptionHandler{
     
            private CatchHandler() {
            }
     
            public static CatchHandler getInstance() {
     
                    return mCatchHandler;
            }
     
            private static CatchHandler mCatchHandler = new CatchHandler();
     
            private Context mContext;
     
            private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
     
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                    if (thread.getName().equals("main")) {
                            ToastException(thread, ex);
                            try {
                                    Thread.sleep(3000);
                            } catch (InterruptedException e) {
                            }
                            android.os.Process.killProcess(android.os.Process.myPid());
                            System.exit(1);
                    } else {
                            handleException(thread, ex);
                    }
     
            }
     
            public void init(Context context) {
                    mContext = context;
                    Thread.setDefaultUncaughtExceptionHandler(this);
            }
     
            private void ToastException(final Thread thread, final Throwable ex) {
                    new Thread() {
                            @Override
                            public void run() {
                                    Looper.prepare();
                                    StringBuilder builder = new StringBuilder();
                                    builder.append("At thread: ").append(thread.getName())
                                                    .append("\n");
                                    builder.append("Exception is :\n").append(ex.getMessage());
     
                                    Toast.makeText(mContext, builder.toString(), Toast.LENGTH_LONG)
                                                    .show();
                                    Looper.loop();
                            }
                    }.start();
            }
     
            private void handleException(final Thread thread, final Throwable ex) {
                    Intent intent =new Intent("per.xch.test2_35.main");
                    <font color="#00ed00">intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);</font>
                    mContext.startActivity(intent);
            }
    }

    然后在项目中引用

    public class CatchApplication extends Application {
            @Override
            public void onCreate() {
                    super.onCreate();
                    CatchHandler.getInstance().init(getApplicationContext());
            }
    }

    注意

    <application
            <font color="#00ed00">android:name=".CatchApplication"</font>

    最后测试下

    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
             
            new Thread(new Runnable() {
                             
                            @Override
                            public void run() {
                                     throw new NullPointerException("please catch me! sub thread");
                            }
                    }).start();
            throw new NullPointerException("please catch me! sub thread");
            
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }

    之所以在主线程和其他线程采用不同处理方式因为主线程崩溃很大程度上就没的救了。
    还有要注意的是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    原因很简单,源码写的很明白


    ContextImpl.java

      @Override
        public void startActivity(Intent intent) {
            if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
                throw new AndroidRuntimeException(
                        "Calling startActivity() from outside of an Activity "
                        + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                        + " Is this really what you want?");
            }
            mMainThread.getInstrumentation().execStartActivity(
                getOuterContext(), mMainThread.getApplicationThread(), null,
                (Activity)null, intent, -1);
        }

    至于怎么把activity怎么变成dialog我就不废话喽,吼,闪人。

    原文链接:http://www.eoeandroid.com/thread-197442-1-1.html

  • 相关阅读:
    P4549 【模板】裴蜀定理
    POJ1606 Jugs
    2. 数据库连接池规范
    14. BootStrap * 组件
    BootStarpt
    13. Flex 弹性布局2 BootStrap
    12. Flex 弹性布局 BootStrap
    CSS3
    21. Servlet3.0 / 3.1 文件上传 Plus
    20. Servlet3.0 新特性
  • 原文地址:https://www.cnblogs.com/vus520/p/2671669.html
Copyright © 2011-2022 走看看