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

  • 相关阅读:
    win7下的vxworks总结
    ubuntu 无法获得锁 /var/lib/dpkg/lock
    项目中用到了的一些批处理文件
    win7下安装 WINDRIVER.TORNADO.V2.2.FOR.ARM
    使用opencv统计视频库的总时长
    January 05th, 2018 Week 01st Friday
    January 04th, 2018 Week 01st Thursday
    January 03rd, 2018 Week 01st Wednesday
    January 02nd, 2018 Week 01st Tuesday
    January 01st, 2018 Week 01st Monday
  • 原文地址:https://www.cnblogs.com/vus520/p/2671669.html
Copyright © 2011-2022 走看看