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。这时候就可以拿着这个去判断,然后写自己的业务逻辑了。