android-notes / Cockroach

降低Android非必要crash
MIT License
3.25k stars 448 forks source link

关于handlerException的一点建议 #11

Closed jeffery812 closed 7 years ago

jeffery812 commented 7 years ago

handlerException里面是否可以用RxAndroid实现,这样如果有耗时操作也可以做了:

    Cockroach.install(new Cockroach.ExceptionHandler() {

        // handlerException内部建议手动try{  你的异常处理逻辑  }catch(Throwable e){ } ,以防handlerException内部再次抛出异常,导致循环调用handlerException

        @Override
        public void handlerException(final Thread thread, final Throwable throwable) {
            //开发时使用Cockroach可能不容易发现bug,所以建议开发阶段在handlerException中用Toast谈个提示框,
            Observable.just(throwable)
                .subscribeOn(Schedulers.io())
                .map(new Func1<Throwable, Throwable>() {
                    @Override public Throwable call(Throwable throwable) {
                        /**
                         * 如果有,耗时操作可以放在这里
                         */
                        return throwable;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Throwable>() {
                    @Override public void call(Throwable throwable) {
                        try {
                            //建议使用下面方式在控制台打印异常,这样就可以在Error级别看到红色log
                            Log.e("AndroidRuntime","--->CockroachException:"+thread+"<---",throwable);
                            Toast.makeText(MyApplication.this, "Exception Happend\n" + thread + "\n" + throwable.toString(), Toast.LENGTH_SHORT).show();
                            //                        throw new RuntimeException("..."+(i++));
                        } catch (Throwable e) {
                            Log.e("AndroidRuntime","--->CockroachException:"+thread+"<---",e);
                        }
                    }
                });
        }
    });

in gradle:

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
android-notes commented 7 years ago

handlerException里面用什么没影响,只是handlerException可能运行在子线程也可能运行在主线程,若在主线程的话就不要做耗时操作,若在子线程的话就不要更新ui,另外如果用第三方库的话要保证如果第三方库出了异常一定能从handlerException中的try catch中捕获到,不然可能会导致一直不停调用handlerException,虽然不会导致栈溢出和ANR,但尽量避免。