readLine()的注意点

转载请标明出处:http://77blogs.com/?p=142

我在用socket做即时通讯的时候,读取服务器返回的信息用了BufferedReader,用起来挺方便的。

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line ;
while ((line = br.readLine())!=null){
}
readLine()用起来很方便,每次都是返回一行。
不过该方法有许多值得注意的地方:

一、网络模式:
1、在网络上,readLine()是阻塞模式,也就是说如果readLine()读取不到数据的话,会一直阻塞,而不是返回null,所以如果你想要在while循环后执形相关操作是不可能的,因为while()里面是一个
死循环,一旦读不到数据,它又开始阻塞,因此永远也无法执形while()循环外面的操作,所以应该把操作放在while循环里面。(在我做的即时通讯里,为了能够不断获取服务器返回的消息,就是用这种方法,不断去服务器获取消息
,一旦有就返回。)

2、在while()里面判断readLine()!= null的时候要赋值给一个String,因为如果不为null,那么这时候已经读了一行。如果用while (br.readLine()!=null),那么下面没法再获取到这一行,所以应该用
while ((line = br.readLine())!=null){}

3、readLine()通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行,所以我们在发送数据的时候要再后面加上这些标志符,否则程序会阻塞。而我是直接用下面这种方法:
PrintStream ps = new PrintStream(socket.getOutputStream(), true, “UTF-8”);
ps.println()。
ps.println()已经包含换行了,所以不要用print(),若是要就要在后面加上换行符;

4、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。

二、读取文件模式:
1、readLine()什么时候才会返回null呢?读取到文件等的结尾时候。(注意和网络上的是不一样的)。

如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到”/r”、”/n”、”/r/n”才会返回。

Android与JS互相调用

转载请标明出处:http://77blogs.com/?p=281

android开发中有经常需要用到android与H5的交互,有必要学一下。

 

如下图

点击各个按钮代表的意思已经很明显,我就不多说了

 

1、先看一下布局:

 

2、编写html页面,并且放在main下的assets资源文件夹下,没有的话请自己创建

 

3、主程序:

custonAndroid为自定义字段,需要与下面代码中的字段一样。
<input type=”button” value=”Js调用Java代码” onclick=”window.customAndroid.jsCallAndroid()”/>
webView.addJavascriptInterface有安全漏洞(H5可以调用android本地的所有方法),所以4.2以上还需要使用注解来表明那些方法是js可以调用的,接下来会讲。

 

H5中这两个方法的作用

如上html中代码,向id为showmsg的h3大小标题中写入字符串

同上,只是显示的现象变成了android传过去的字符串了。

js调用android:

@JavascriptInterface也就是我上面说的注解,4.2以上必须使用这个注解,否则js无法调用本地的方法。本地方法的名称需要与H5中定义的一样。
实践证明,js调用的方法并不是在主线程中,而是在线程名为JavaBridge的线程中。

当我们点击下面webview中的按钮的时候便会执行这两个方法。

WebView断网提示

转载请标明出处,维权必究http://77blogs.com/?p=497

 

重写WebViewClient中的方法,然后WebView.setWebViewClient(mWebViewClient);

 

在onReceivedError中便可以进行网络出错时候的提示与处理,若是走到这里说明网络出错,或者服务器出错。可以在该方法中进行判断是不是没有网络。6.0以上与6.0以下的都可以用该方法进行监听回调。

实践证明

1、在该方法被调用后,onPageFinished()方法也会被回调,所以最好不要在该方法中进行页面重置操作,比如断网时候弹出断网页面,但是若在onPageFinished()里面去显示正常页面,那么断网提示就消失了。

2、onPageFinished()会调用多次)

 

不过在6.0以上的时候又增加了一个新的方法:

 

实践证明:成功加载出网页的时候也会回调该方法,或者出现其他非网络错误的时候也会,所以我们需要通过error来判断是什么错误,进行过滤处理。