• 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

  • 相关阅读:
    C++中的名字重整技术
    Linux下C++开发常用命令
    《Effective C++(第三版)》 的55条建议
    我也介绍下sizeof与strlen的区别
    POJ
    HDU
    HDU-1754-I Hate It(单点更新+区间查询)
    HDU多校1003-Divide the Stones(构造)
    Just an Old Puzzle(2019多校1007)
    Idiomatic Phrases Game(最短路+注意坑点)
  • 原文地址:https://www.cnblogs.com/vus520/p/2671669.html
Copyright © 2020-2023  润新知