loadListenter implements DownloadListener{
? ? ? ? @Override
? ? ? ? public void onDownloadStart(String url, String userAgent,
? ? ? ? ? ? ? ? String contentDisposition, String mimetype, long contentLength) {
? ? ? ? ? ? System.out.println("url ==== >" + url);
? ? ? ? ? ? //new HttpThread(url).start();
? ? ? ? ? ?
? ? ? ? ? ? Uri uri = Uri.parse(url);
? ? ? ? ? ? Intent intent = new Intent(Intent.ACTION_VIEW, uri);
? ? ? ? ? ? startActivity(intent);
? ? ? ? }
? ? ? ?
? ? }
三、错误处理
当我们使用浏览器的时候,通常因为加载的页面的服务器的各种原因导致各种出错的情况,最平常的比如404错误,通常情况下浏览器会提示一个错误提示页面。事实上这个错误提示页面是浏览器在加载了本地的一个页面,用来提示用户目前已经出错了。
但是当我们的app里面使用webview控件的时候遇到了诸如404这类的错误的时候,若也显示浏览器里面的那种错误提示页面就显得很丑陋了,那么这个时候我们的app就需要加载一个本地的错误提示页面,即webview如何加载一个本地的页面。
1. 首先我们需要些一个html文件,比如error_handle.html,这个文件里面就是当出错的时候需要展示给用户看的一个错误提示页面,尽量做的精美一些。然后将该文件放置到代码根目录的assets文件夹下。
2. 随后我们需要复写WebViewClient的onRecievedError方法,该方法传回了错误码,根据错误类型可以进行不同的错误分类处理
webview.setWebViewClient(new WebViewClient(){
? ? ?
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onReceivedError(WebView view, int errorCode,
? ? ? ? ? ? ? ? ? ? String description, String failingUrl) {
? ? ? ? ? ? ? ? switch(errorCode)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? case HttpStatus.SC_NOT_FOUND:
? ? ? ? ? ? ? ? ? ? view.loadUrl("file:///android_assets/error_handle.html");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
其实,当出错的时候,我们可以选择隐藏掉webview,而显示native的错误处理控件,这个时候只需要在onReceivedError里面显示出错误处理的native控件同时隐藏掉webview即可。
四、webview同步cookies
cookies是服务器用来保存每个客户的常用信息的,下次客户进入一个诸如登陆的页面时服务器会检测cookie信息,如果通过则直接进入登陆后的页面。
在webview中,如果之前已经登陆过了,那么下次再进入同样的登陆界面时??若需要再次登陆的话,一定会很恼人,所以这里提供一个webview同步cookies的方法。
1.首先,我们假设某个网站的登陆界面需要提供两个参数,一个是name,一个是pwd,那么要是对这个页面进行登陆,那么必须给与这两个信息。我们假设服务器已经注册了name为jason,pwd为123456这个账号。
2.下面,写一个Thread用来将name和pwd自动的登入,在服务器返回的response中获得cookie信息,稍后对这个cookie进行保存,这里先给出这个Thread的代码:
public class HttpCookie extends Thread {
? ? private Handler mHandler;
? ? public HttpCookie(Handler mHandler) {
? ? ? ? this.mHandler = mHandler;
? ? }
? ?
? ? @Override
? ? public void run() {
? ? ? ? HttpClient client = new DefaultHttpClient();
? ? ? ? HttpPost post = new HttpPost("");//this place should add the login address
? ? ? ?
? ? ? ? List list = new ArrayList();
? ? ? ? list.add(new BasicNameva luePair("name", "jason"));
? ? ? ? list.add(new BasicNameva luePair("pwd", "123456"));
? ? ? ?
? ? ? ? try {
? ? ? ? ? ? post.setEntity(new UrlEncodedFormEntity(list));
? ? ? ? ? ? HttpResponse reponse = client.execute(post);
? ? ? ? ? ? if(reponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
? ? ? ? ? ? ? ? AbstractHttpClient absClient = (AbstractHttpClient) client;
? ? ? ? ? ? ? ? List cookies = absClient.getCookieStore().getCookies();
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? for(Cookie cookie:cookies){
? ? ? ? ? ? ? ? ? ? if(cookie != null){
? ? ? ? ? ? ? ? ? ? ? ? //TODO
? ? ? ? ? ? ? ? ? ? ? ? //this place would get the cookies
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? } catch (UnsupportedEncodingException e) {
? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (ClientProtocolException e) {
? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ?
}
由于这是一个子线程,所以需要在主线程中创建并执行。
同时,因为其实子线程,那么里面必须含有一个handler的元素,用来当成功获取cookie后通知主线程进行同步和保存。初始化这个子线程的时候需要将主线程上的handler给传过来,随后在以上代码的TODO中发送消息,让主线程记录cookie,发送的这个消息需要将cookie信息包含进去:
if(cookie != null){
? ? //TODO
? ? //this place would get the cookies
? ? M