2017年9月 bug总结

来源:互联网 发布:linux 查看日志文件 编辑:程序博客网 时间:2024/05/17 23:34

1.延迟加载的流程

最近在公司看见这么一段代码(做的是扫描蓝牙,并且链接的,但是业务有点复杂,我就不贴业务逻辑的代码了,只看这个延迟加载。)

 private void scanLeDevice(final boolean enable) { mHandler.postDelayed(new Runnable() {                @Override                public void run() {                    Log.i("robin", "scanLeDevice-->run: ");                }            }, 5000);            try {                Log.i("robin", "scanLeDevice:-->try: ");                mTimer = new Timer();                mTimer.schedule(new TimerTask() {                    @Override                    public void run() {                        Log.i("robin", "scanLeDevice:-->try:-->schedule:-->run ");                        Handler h = new Handler(Looper.getMainLooper());                        if (!mProgressed) {                            h.post(new Runnable() {                                public void run() {                                    Log.i("robin", "scanLeDevice:-->try:-->schedule:-->run -->post");                                    if(tryTimes != 5){                                        tryTimes++;                                        scanLeDevice(true);                                    } else {                                        tryTimes = 1;                                    }                                }                            });                        }                    }                }, 5000);            } catch(Exception e){                e.printStackTrace();                Log.w(TAG,"Timer was canceled");            }   }

上面的代码我已经把业务逻辑的代码剥离出去了,主要意思大家都懂。
log结果如下:(注意时间!!)

     09-13 09:25:39.476 6891-6891/? I/robin: scanLeDevice:-->try:      09-13 09:25:44.476 6891-7150/? I/robin: scanLeDevice:-->try:-->schedule:-->run      09-13 09:25:44.476 6891-6891/? I/robin: scanLeDevice-->run:      09-13 09:25:44.486 6891-6891/? I/robin: scanLeDevice:-->try:-->schedule:-->run -->post     09-13 09:25:44.496 6891-6891/? I/robin: scanLeDevice:-->try:     09-13 09:25:49.496 6891-7162/? I/robin: scanLeDevice:-->try:-->schedule:-->run      09-13 09:25:49.496 6891-6891/? I/robin: scanLeDevice-->run:      09-13 09:25:49.506 6891-6891/? I/robin: scanLeDevice:-->try:-->schedule:-->run -->post     09-13 09:25:49.506 6891-6891/? I/robin: scanLeDevice:-->try:      09-13 09:25:54.506 6891-7163/? I/robin: scanLeDevice:-->try:-->schedule:-->run      09-13 09:25:54.516 6891-6891/? I/robin: scanLeDevice-->run:      09-13 09:25:54.516 6891-6891/? I/robin: scanLeDevice:-->try:-->schedule:-->run -->post     09-13 09:25:54.516 6891-6891/? I/robin: scanLeDevice:-->try:      09-13 09:25:59.516 6891-7166/? I/robin: scanLeDevice:-->try:-->schedule:-->run      09-13 09:25:59.536 6891-6891/? I/robin: scanLeDevice-->run:      09-13 09:25:59.536 6891-6891/? I/robin: scanLeDevice:-->try:-->schedule:-->run -->post     09-13 09:25:59.536 6891-6891/? I/robin: scanLeDevice:-->try:     09-13 09:26:04.536 6891-7167/? I/robin: scanLeDevice:-->try:-->schedule:-->run      09-13 09:26:04.546 6891-6891/? I/robin: scanLeDevice-->run:      09-13 09:26:04.556 6891-6891/? I/robin: scanLeDevice:-->try:-->schedule:-->run -->post

2.android 6.0以上AlertDialog的按钮无法小写。

有的童鞋肯定碰到过用原生的AlertDialog的时候,用到如下代码

builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                XXX            }        });

运行之后发现竟然全变成大写了,而低版本的手机没有这个问题
解决方案:
在style文件里面:
新建style:

<style name="DialogButton" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">        <item name="textAllCaps">false</item>    </style>

找到AppTheme,没有就新建一个AppTheme的style,具体不多说,
然后在AppTheme里面加上这一句

 <item name="buttonBarButtonStyle">@style/DialogButton</item>

3.webview 无法监听点击按钮的url
最近有一个业务是,点击webview的一个按钮,不管当前在那个页面都关闭webview,有的同学肯定想到了webview.setWebViewClient里面override的这两个方法
shouldOverrideUrlLoading
onPageFinished
确实,只要有新的url触发,这两个监听都会触发。但是,后台给我的链接,确无法触发。
举个例子:
当前页面url是:www.baidu.com
点击返回到首页的按钮的url是:www.baidu.com#back_to_app
这里首先要说一下#的含义:不触发网页重载,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。参考文章。所以不会重新加载,也就不会触发shouldOverrideUrlLoading,onPageFinished这两个方法。然后我再stack overflow上面找到了这样一篇文章:stack overflow。里面有这样一段代码:

Use a hash in your final URL like http://domain.com/thanks.html#closeWebview then watch URL.On Android :mWebview.setWebViewClient(new WebViewClient() {    @Override    public void onPageFinished(WebView view, String url) {        super.onPageFinished(view, url);        if (url.endsWith("#closeWebview")){            mWebview.setVisibility(View.GONE);        }    }});

onPageFinished,当前页面加载完毕(注意,这个地方的加载不是重新加载,只能说是改变),就会触发这个监听,成功监听到www.baidu.com#back_to_app。这时候就可以拿着这个去判断,然后写自己的业务逻辑了。