精华内容
下载资源
问答
  • android框架加载网页

    2015-06-08 09:49:28
    这个东西对于刚刚接触android或者是刚刚参加工作的人很有用,谁需要的话可以学习学习。
  • 运用XML解析技术实现动态的ANDROID页面加载功能,让ANDROID的企业级开发变得如编写网页一样简单。它主要由XML页面,启动主ACTIVITY处理逻辑类和主页面程序组成,极大的提高ANDROID的开发效率,动态加载页面灵活方便...

     

    项目名称:

    AXF (ActXmlFromFramework) 活动ANDROID页面展现框架。

    项目简介:

    运用XML解析技术实现动态的ANDROID页面加载功能,让ANDROID的企业级开发变得如编写网页一样简单。它主要由XML页面,启动主ACTIVITY处理逻辑类和主页面程序组成,极大的提高ANDROID的开发效率,动态加载页面灵活方便,让客户在后台控制前端程序页面成为可能。

    应用范围:

    本框架可广泛应用于金融、保险、政府、企业等项目的定制开发中,让开发变得简单,让企业实现灵活配置页面,让ANDROID项目优美展现。

     

    代码示例:

             为了给大家一个直观的印象,先给大家看一个页面代码和生成页面后的示例。

    页面代码1

    生成的页面效果:1

    页面代码1中添加两个标签项目2

    修改后的代码生成页面的效果:2

    展开全文
  • 今天我们来学习一下重写WebView组件来实现网页加载,以及我们平时APP开发中经常使用的JS注入,js和java相互调用的问题来重点讲解一下。如果大家都WebView加载还不是太熟悉的话,这边我之前专门写了一个WebView的...

    转载请标明出处: 

    http://blog.csdn.net/developer_jiangqq/article/details/49687613
    本文出自:【江清清的博客】

    ().前言:   

             【好消息】个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org

           今天我们来学习一下重写WebView组件来实现网页的加载,以及我们平时APP开发中经常使用的JS注入,js和java相互调用的问题来重点讲解一下。如果大家都WebView加载还不是太熟悉的话,这边我之前专门写了一个WebView的专题,其他包含基本使用和js注入的问题。(点击进入WebView进阶专题)

            FastDev4Android框架项目地址:https://github.com/jiangqqlmj/FastDev4Android

    ().重写WebView:   

            2.1首先我们来看一下实现的效果:


     


     2.2.重写WebView:创建一个HTML5CustomWebView类集成自WebView,然后就是一下几个步骤实现:

    •  布局文件
    •  WebSettings初始化相关设置
    •  设置重写WebChromeClient进行相关处理
    • 设置重写WebViewClient进行相关处理即可

       简单的来说就是以上这几步就可以了

    2.3.WebView布局文件主要定义导航栏,网页加载进度,以及WebView容器布局,如下:

    <?xmlversion="1.0" encoding="utf-8"?>
    <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:background="@color/white">
        <RelativeLayout
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
            <FrameLayout
               android:id="@+id/fullscreen_custom_content"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:background="@color/white"
                android:visibility="gone"/>
            <LinearLayout
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:orientation="vertical" >
                <!-- 自定义顶部导航功能条 -->
                <includelayout="@layout/common_top_bar_layout" />
                <!-- 中间显示内容 -->
                <FrameLayout
                   android:id="@+id/main_content"
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent"
                   android:visibility="gone" />
                <!-- 网页加载进度显示 -->
                <FrameLayout
                   android:id="@+id/frame_progress"
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent"
                   android:visibility="visible" >
                    <LinearLayout
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center"
                       android:orientation="vertical" >
     
                        <ProgressBar
                           style="@android:style/Widget.ProgressBar.Small"
                           android:layout_width="wrap_content"
                           android:layout_height="wrap_content"
                           android:layout_gravity="center_horizontal"
                           android:indeterminate="false"
                           android:indeterminateDrawable="@drawable/loading_small" />
     
                        <TextView
                           android:id="@+id/webview_tv_progress"
                           android:layout_width="wrap_content"
                           android:layout_height="wrap_content"
                           android:layout_marginTop="3dip"
                           android:text="正在加载,已完成0%..."
                           android:textSize="12sp" />
                    </LinearLayout>
                </FrameLayout>
            </LinearLayout>
        </RelativeLayout>
     
    </FrameLayout>

       2.4.WebSettings初始化设置如下:

    WebSettingswebSettings = this.getSettings();
    webSettings.setJavaScriptEnabled(true);  //开启javascript
    webSettings.setDomStorageEnabled(true);  //开启DOM
    webSettings.setDefaultTextEncodingName("utf-8");//设置编码
    // // web页面处理
    webSettings.setAllowFileAccess(true);// 支持文件流
    // webSettings.setSupportZoom(true);// 支持缩放
    // webSettings.setBuiltInZoomControls(true);// 支持缩放
    webSettings.setUseWideViewPort(true);// 调整到适合webview大小
    webSettings.setLoadWithOverviewMode(true);//调整到适合webview大小
    webSettings.setDefaultZoom(ZoomDensity.FAR);//屏幕自适应网页,如果没有这个,在低分辨率的手机上显示可能会异常
    webSettings.setRenderPriority(RenderPriority.HIGH);
    //提高网页加载速度,暂时阻塞图片加载,然后网页加载好了,在进行加载图片
    webSettings.setBlockNetworkImage(true);
    //开启缓存机制
    webSettings.setAppCacheEnabled(true);
    //根据当前网页连接状态
     if(StrUtils.getAPNType(context)==StrUtils.WIFI){
     //设置无缓存
     webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
     }else{
     //设置缓存
     webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
     }
                  

         2.5.WebChromeClient进行相关设置处理

    private classMyWebChromeClient extends WebChromeClient {
    privateBitmap mDefaultVideoPoster;
    @Override
    publicvoid onShowCustomView(View view,
    CustomViewCallbackcallback) {
    super.onShowCustomView(view,callback);
    HTML5CustomWebView.this.setVisibility(View.GONE);
    if(mCustomView != null) {
    callback.onCustomViewHidden();
    return;
    }
    mCustomViewContainer.addView(view);
    mCustomView= view;
    mCustomViewCallback= callback;
    mCustomViewContainer.setVisibility(View.VISIBLE);
    }
     
    @Override
    publicvoid onHideCustomView() {
    if(mCustomView == null) {
    return;
    }
    mCustomView.setVisibility(View.GONE);
    mCustomViewContainer.removeView(mCustomView);
    mCustomView= null;
    mCustomViewContainer.setVisibility(View.GONE);
    mCustomViewCallback.onCustomViewHidden();
    HTML5CustomWebView.this.setVisibility(View.VISIBLE);
    super.onHideCustomView();
    }
     
    /**
     * 网页加载标题回调
     * @param view
     * @param title
     */
    @Override
    publicvoid onReceivedTitle(WebView view, String title) {
    Log.d("zttjiangqq", "当前网页标题为:" + title);
    wv_tv_title.setText(title);
    }
     
    /**
     * 网页加载进度回调
     * @param view
     * @param newProgress
     */
    @Override
    publicvoid onProgressChanged(WebView view, int newProgress) {
    // 设置进行进度
    ((Activity)mContext).getWindow().setFeatureInt(
    Window.FEATURE_PROGRESS,newProgress * 100);
    webview_tv_progress.setText("正在加载,已完成" +newProgress + "%...");
    webview_tv_progress.postInvalidate(); //刷新UI
    Log.d("zttjiangqq", "进度为:" + newProgress);
    }
     
    @Override
    publicboolean onJsAlert(WebView view, String url, String message,
    JsResultresult) {
    returnsuper.onJsAlert(view, url, message, result);
     
    }
    }

      2.6.WebViewClient进行相关设置处理

    private classMyWebViewClient extends WebViewClient {
    /**
     *加载过程中 拦截加载的地址url
     * @param view
     *@param url  被拦截的url
     * @return
     */
    @Override
    publicboolean shouldOverrideUrlLoading(WebView view, String url) {
    Log.i("zttjiangqq","-------->shouldOverrideUrlLoading url:" + url);
    //这边因为考虑到之前项目的问题,这边拦截的url过滤掉了zttmall://开头的地址
    //在其他项目中 大家可以根据实际情况选择不拦截任何地址,或者有选择性拦截
    if(!url.startsWith("zttmall://")){
    UrimUri = Uri.parse(url);
    List<String>browerList = new ArrayList<String>();
    browerList.add("http");
    browerList.add("https");
    browerList.add("about");
    browerList.add("javascript");
    if(browerList.contains(mUri.getScheme())) {
    returnfalse;
    }else {
    Intentintent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    intent.addCategory(Intent.CATEGORY_BROWSABLE);
    //如果另外的应用程序WebView,我们可以进行重用
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Browser.EXTRA_APPLICATION_ID,
    FDApplication.getInstance()
    .getApplicationContext().getPackageName());
    try{
    FDApplication.getInstance().startActivity(intent);
    returntrue;
    }catch (ActivityNotFoundException ex) {
    }
    }
    returnfalse;
    }else{
    returntrue;
    }
    }
    /**
     * 页面加载过程中,加载资源回调的方法
     * @param view
     * @param url
     */
    @Override
    publicvoid onLoadResource(WebView view, String url) {
    super.onLoadResource(view,url);
    Log.i("zttjiangqq","-------->onLoadResource url:" + url);
    }
    /**
     * 页面加载完成回调的方法
     * @param view
     * @param url
     */
    @Override
    publicvoid onPageFinished(WebView view, String url) {
    super.onPageFinished(view,url);
    Log.i("zttjiangqq","-------->onPageFinished url:" + url);
    if(isRefresh) {
    isRefresh= false;
    }
    // 加载完成隐藏进度界面,显示WebView内容
    frame_progress.setVisibility(View.GONE);
    mContentView.setVisibility(View.VISIBLE);
    // 关闭图片加载阻塞
    view.getSettings().setBlockNetworkImage(false);
     
    }
    /**
     * 页面开始加载调用的方法
     * @param view
     * @param url
     * @param favicon
     */
    @Override
    publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {
    Log.d("zttjiangqq","onPageStarted:-----------"+url);
    super.onPageStarted(view,url, favicon);
    }
     
    @Override
    publicvoid onReceivedError(WebView view, int errorCode,
    Stringdescription, String failingUrl) {
    super.onReceivedError(view,errorCode, description, failingUrl);
    }
     
    @Override
    publicvoid onScaleChanged(WebView view, float oldScale, float newScale) {
    super.onScaleChanged(view,oldScale, newScale);
    HTML5CustomWebView.this.requestFocus();
    HTML5CustomWebView.this.requestFocusFromTouch();
    }
     
    }

      以上一般使用到得方法已经做了相关的注释。

      最后一步就是使用了,使用起来很简单,创建一个Activity,然后把我们定义的WebView加入到布局然后加载网页即可。如下:

    packagecom.chinaztt.fda.html5;
    importandroid.content.Context;
    importandroid.content.Intent;
    importandroid.content.res.Configuration;
    importandroid.net.Uri;
    importandroid.os.Bundle;
    importandroid.view.KeyEvent;
    importandroid.view.MotionEvent;
    importandroid.webkit.DownloadListener;
    importandroid.webkit.JavascriptInterface;
    /**
     * 当前类注释:
     * 项目名:FastDev4Android
     * 包名:com.chinaztt.fda.html5
     * 作者:江清清 on 15/11/06 08:59
     * 邮箱:jiangqqlmj@163.com
     * QQ: 781931404
     * 公司:江苏中天科技软件技术有限公司
     */
    importcom.chinaztt.fda.ui.base.BaseActivity;
     
    public classHTML5WebViewCustomAD extends BaseActivity {
    privateHTML5CustomWebView mWebView;
    //http://www.zttmall.com/Wapshop/Topic.aspx?TopicId=18
    privateString ad_url = "http://www.baidu.com/";
    private String title="百度一下你就知道";
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWebView= new HTML5CustomWebView(this, HTML5WebViewCustomAD.this,title,ad_url);
    mWebView.setDownloadListener(newDownloadListener() {
    @Override
    publicvoid onDownloadStart(String url, String userAgent,
    StringcontentDisposition, String mimetype,
    longcontentLength) {
    Uriuri = Uri.parse(url);
    Intentintent = new Intent(Intent.ACTION_VIEW, uri);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    }
    });
            //准备javascript注入
    mWebView.addJavascriptInterface(
    newJs2JavaInterface(),"Js2JavaInterface");
    if(savedInstanceState != null) {
    mWebView.restoreState(savedInstanceState);
    }else {
    if(ad_url != null) {
    mWebView.loadUrl(ad_url);
    }
    }
    setContentView(mWebView.getLayout());
     
    }
    @Override
    publicvoid onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if(mWebView != null) {
    mWebView.saveState(outState);
    }
    }
     
    @Override
    protectedvoid onResume() {
    super.onResume();
    if(mWebView != null) {
    mWebView.onResume();
    }
    }
     
    @Override
    publicvoid onStop() {
    super.onStop();
    if(mWebView != null) {
    mWebView.stopLoading();
    }
    }
    @Override
    protectedvoid onPause() {
    super.onPause();
    if(mWebView != null) {
    mWebView.onPause();
    }
    }
     
    @Override
    protectedvoid onDestroy() {
    super.onDestroy();
    if(mWebView != null) {
    mWebView.doDestroy();
    }
    }
     
    @Override
    publicvoid onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    }
     
    @Override
    publicboolean onTouchEvent(MotionEvent event) {
    returnsuper.onTouchEvent(event);
    }
     
    @Override
    publicboolean onKeyDown(int keyCode, KeyEvent event) {
    returnsuper.onKeyDown(keyCode, event);
    }
    @Override
    publicvoid onBackPressed() {
    if(mWebView != null) {
    if(mWebView.canGoBack()){
    mWebView.goBack();
    }else{
    mWebView.releaseCustomview();
    }
    }
    super.onBackPressed();
    }
    /**
     * JavaScript注入回调
     */
    publicclass Js2JavaInterface {
    privateContext context;
    privateString TAG = "Js2JavaInterface";
    @JavascriptInterface
    publicvoid showProduct(String productId){
    if(productId!=null){
    //进行跳转商品详情
    showToastMsgShort("点击的商品的ID为:" +productId);
    }else{
    showToastMsgShort("商品ID为空!");
    }
    }
    }
    }

    ().js注入方法

          仔细查看上面的代码可能大家会发现这样两块地方:

    mWebView.addJavascriptInterface(
    newJs2JavaInterface(),"Js2JavaInterface");
    public classJs2JavaInterface {
    privateContext context;
    privateString TAG = "Js2JavaInterface";
    @JavascriptInterface
    publicvoid showProduct(String productId){
    if(productId!=null){
    //进行跳转商品详情
    showToastMsgShort("点击的商品的ID为:" +productId);
    }else{
    showToastMsgShort("商品ID为空!");
    }
    }
    }

    这边就是js注入回调处理的方法,在这边的实例中是使用http://www.zttmall.com/Wapshop/Topic.aspx?TopicId=18这个地址进行加载网页的时候才会生效,因为这边点击网页图片的时候,html代码中加载js方法,

    我们来看一下网页的源代码:


    查看源代码我们就知道

    mWebView.addJavascriptInterface(
    newJs2JavaInterface(),"Js2JavaInterface");

    中第二个参数就是在js方法中调用的对象名字,然后注入对象中回调的方法和js方法中的方法一样即可。这样就完成了一次注入点击回调工作,我们的html就可以和原生java代码发生交互了。使用这种方式非常有助于我们的混合开发。

          好了到此重写WebView实现以及js注入的基本使用就讲完了,具体全部代码已经上传到FastDev4Android项目中了。同时欢迎大家去Github站点进行clone或者下载浏览:

    https://github.com/jiangqqlmj/FastDev4Android 同时欢迎大家starfork整个开源快速开发框架项目~

    尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!

    关注我的订阅号(codedev123),每天分享移动开发技术(Android/IOS),项目管理以及博客文章!第一时间获取推送文章!


    关注我的微博,可以获得更多精彩内容



    展开全文
  • activity加载自己云服务器网页图片 package com.example.app3; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import com.bumptech.glide.Glide;...

    清单文件中添加访问网络权限并防止图片不显示
    在这里插入图片描述
    activity加载自己云服务器网页图片

    package com.example.app3;
    
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ImageView;
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.request.RequestOptions;
    import com.bumptech.glide.request.target.Target;
    
    import java.net.URI;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView iv = (ImageView) findViewById(R.id.iv);
            Glide.with(iv).load("http://www.zlm.design/p.jpg").apply(new RequestOptions().override(Target.SIZE_ORIGINAL)).into(iv);
        }
    }
    

    在这里插入图片描述

    展开全文
  • 之前用到过python中的爬虫实现网页数据的爬取,但Android的并没有用到过,由于公司项目需求需要用到,所以研究了下Android网页爬虫的实现,在解决了公司项目功能需求的同时,在这里用博客做下笔记,开源下贡献出来...

    之前用到过python中的爬虫实现网页数据的爬取,但Android的并没有用到过,由于公司项目需求需要用到,所以研究了下Android中网页爬虫的实现,在解决了公司项目功能需求的同时,在这里用博客做下笔记,开源下贡献出来干货让更多喜欢研究爬虫技术的兄弟们可以拿来学习研究。
    Android里面支持爬虫的框架首选jsoup,支持AndroidStudio直接在app目录下的build.gradle文件中进行依赖引入,jsoup除了支持Android也支持java,所以java写爬虫的话首选的库也是它。
    下面来讲如何使用这个库来进行Android爬虫开发:

    第一步就是进行在项目工程app目录下的build.gradle文件中进行依赖引入对jsoup库:

    implementation 'org.jsoup:jsoup:1.10.2'

    第二步:查看jsoup官方文档,了解jsoup在代码中的初始化调用和爬虫提取标签的各种选择器使用方法,这里附上官方说明文档地址(http://www.open-open.com/jsoup/selector-syntax.htm
    这里做下搬运,直接粘过来几段常用的:
    使用选择器语法来查找元素
    问题
    你想使用类似于CSS或jQuery的语法来查找和操作元素。

    方法
    可以使用Element.select(String selector) 和 Elements.select(String selector) 方法实现:

    File input = new File(“/tmp/input.html”);
    Document doc = Jsoup.parse(input, “UTF-8”, “http://example.com/“);

    Elements links = doc.select(“a[href]”); //带有href属性的a元素
    Elements pngs = doc.select(“img[src$=.png]”);
    //扩展名为.png的图片

    Element masthead = doc.select(“div.masthead”).first();
    //class等于masthead的div标签

    Elements resultLinks = doc.select(“h3.r > a”); //在h3元素之后的a元素
    说明
    jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.

    这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

    Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

    Selector选择器概述

    tagname: 通过标签查找元素,比如:a
    ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素#id
    : 通过ID查找元素,比如:#logo
    .class: 通过class名称查找元素,比如:.masthead
    [attribute]: 利用属性查找元素,比如:[href]
    [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
    [attr=value]: 利用属性值来查找元素,比如:[width=500]
    [attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
    [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
    *: 这个符号将匹配所有元素
    Selector选择器组合使用
    el#id: 元素+ID,比如: div#logo
    el.class: 元素+class,比如: div.masthead
    el[attr]: 元素+class,比如: a[href]
    任意组合,比如:a[href].highlight
    ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 p元素
    parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
    siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
    siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
    el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo
    伪选择器selectors
    :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
    :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
    :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
    :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
    :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表
    :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
    :containsOwn(text): 查找直接包含给定文本的元素
    :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
    :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
    注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等
    
    

    第三步开始项目实践与使用:
    比如我想分别循环爬百度网页的一些东西,根据我得到的网页源码然后判断每一个列表中单个item网站标题是否是我想抓取的一个网站,然后进行一些爬取的操作等

    /**
     * Created by JunJieW on 2018/8/13.
     * 用一个weiview进行网页详情页
     * 和请求分页列表网页浏览加载
     */
    
    public class MyWebViewClient5 extends WebViewClient {
        private String TAG = "MyWebViewClient5";
        private WebViewLoad webViewLoad = null;
        public static Boolean isLoadOK = true;
        public static boolean isChiledLoad = false;
        // 本次请求网页的源码中第几页span标签上的文本内容
        public static String htmlstr = "";
        // 上次请求网页的源码中第几页span标签上的文本内容
        public static String last_htmlstr = "aaaaaaa";
        private  Document doc;
        private  Elements els;
        private  Document jsoup;
    
    
    private void getPageHtml(final WebView view, final String url) {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    try {
                        Log.d(TAG+"ssssss==",url);
                        Log.d(TAG+"ssssss==","decode=="+URLDecoder.decode(url,"UTF-8"));
                        final boolean[] isOK = {false}; //是否已经匹配到了网页条目,如果为false则不会进行循环翻页的操作
                         jsoup = Jsoup.connect(URLDecoder.decode(url,"UTF-8")).get();
                         doc = Jsoup.parse(jsoup.html(), "UTF-8");
    
                        // 保存网页源码到.txt文件中
    //                    SaveHtmlToFileUtil.saveHtmlToFile(doc.html().replace(Jsoup.parse("&nbsp;").text(), " "));
                        Log.d(TAG+"html", "==" +doc.text());
                          els = doc.select("a[href]"); //拿到所有带有href属性的a元素
                        Log.d(TAG, "a_href==" + els.attr("abs:href") .toString());
    
                        //获取到class等于new-nowpage的span标签
                        Element element = doc.select("span.new-nowpage").first();
                        // 记录更新本次请求网页的页数spqn标签上文本
                        if (element!=null){
                            htmlstr = element.text();
                            Log.d(TAG+"--", "span.new-nowpage==" + htmlstr.toString());
                        }
    
                      // 方法一,直接取出a标签和这个a标签下的所有子标签上的文字,拼接为一个字符串,判断里面是否有关键字标题来匹配判断是否是目标网站
                        int i = 0;
                        while ( i< els.size()) {
                            String allaTest = "";
                            Elements allElements = els.get(i).getAllElements();
                            int j = 0;
                            while (j< allElements.size()){
                                allaTest+=allElements.get(j).text();
                                j++;
                            }
                            Log.d(TAG+"sss","i=="+i+"allaTest=="+allaTest);
    
                            if (allaTest.contains(MainActivity2.Companion.getWk())){
    //                            SystemClock.sleep(5000);
                                final int finalI = i;
                                view.post(new Runnable() {
                                    @Override
                                    public void run() {
                                    Toast.makeText(view.getContext(),"找到了目标",Toast.LENGTH_SHORT).show();
                                        SystemClock.sleep(1000);     
                                        isChiledLoad = true;
                                        isOK[0] = true;
                                    }
                                });
    
                                break;
    
                            }
                            i++;
                        }
    
    
    
    
    
                        //分页请求自动控制停止重新再来方案: 如果上次请求来的网页源码和这次的一摸一样,就说明已经是最后的一页了,不再继续往后进行分页请求,重新开始搜索第一页
                        if (last_htmlstr.equals(htmlstr)){
                            view.post(new Runnable() {
                                @Override
                                public void run() {
    //                                SystemClock.sleep(3000);
                                    MainActivity2.Companion.setPn(0);
                                    String url ="https://www.baidu.com/from=844b/s?pn="+0+"&usm="+0+"&word="+MainActivity2.Companion.getWd()+"&sa=np&rsv_pq=10174940593401999016&rsv_t=4442boxupT4C5j5XyOJtpeDcP4cL3%252F5oEemiV7j38esNdoSoWCO2TeQVRA&ms=1&rqid=10174940593401999016&adid=8d34a68f806daea8";
                                    view.loadUrl(url);
                                    isChiledLoad = false ;
                                    isOK[0] = true;
                                    Log.d(TAG,"调用访问到最后1页后不再往后继续循环分页请求,重新开始搜索第一页");
    // 这里就是百度的分页请求的一个分页参数,好像是数据的条数,除以10后就是网页的分页参数                                MainActivity2.Companion.setPn(MainActivity2.Companion.getPn() + 10);
                                    htmlstr = "";
                                }
                            });
                        }
    
                        // 记录上一次访问网页的页数spqn标签上文本
                        last_htmlstr = htmlstr;
    
    
                        // 向下进行分页请求的方法逻辑块
                        if (!isOK[0]){
                            MainActivity2.Companion.setPn(MainActivity2.Companion.getPn() + 10);
                            view.post(new Runnable() {
                                @Override
                                public void run() {
                                    int usm = 0;
                                    if (MainActivity2.Companion.getPn()!=0){
                                        usm = MainActivity2.Companion.getPn()/10;
                                    }
    //                                SystemClock.sleep(3000);
                                    String url ="https://www.baidu.com/from=844b/s?pn="+MainActivity2.Companion.getPn()+"&usm="+usm+"&word="+MainActivity2.Companion.getWd()+"&sa=np&rsv_pq=10174940593401999016&rsv_t=4442boxupT4C5j5XyOJtpeDcP4cL3%252F5oEemiV7j38esNdoSoWCO2TeQVRA&ms=1&rqid=10174940593401999016&adid=8d34a68f806daea8";
                                    view.loadUrl(url);
                                    isChiledLoad = false ;
                                    isOK[0] = true;
                                }
                            });
                        }
    
    
              // 方法二,使用纯粹的jsoup里面的选择器方法从所有的a标签里面提取文字,判断子标签里面是否有<em>,<h3>,<p>标签,如果有的话判断是否含有搜索的关键字标题进行判断是否是目标网站
    //                    for (int i = 0;i< els.size();i++) {
    //                            if (els.get(i).children().tagName("p") != null) {
    //                                Log.d(TAG+"22","p上的test=="+els.get(i).children().tagName("p").text());
    //                                if (els.get(i).children().tagName("p").text().contains(URLEncoder.encode(MainActivity2.Companion.getWd(),"GBK"))
    //                                        ||els.get(i).children().tagName("p").text().contains(MainActivity2.Companion.getWd())){
                                        MainActivity.Companion.webview2Load(els.get(i).attr("abs:href") .toString());
    //                                    Log.d(TAG+"333","p里面有"+ MainActivity2.Companion.getWd());
                                        Thread.sleep(1000)
    //                                    if (StringUtils.StringIsNull(els.get(i).attr("abs:href") .toString())){
    //                                        if (isLoadOK = true){
    //                                            webViewLoad.loadWebUrl(els.get(i).attr("abs:href") .toString());
    //                                            isChiledLoad = true ;
    //                                            isOK[0] = true;
    //                                            break;
    //                                        }
    //                                    }
    //                                }else {
    //                                    Log.d(TAG,"p.text()=="+els.get(i).children().tagName("p"));
    //                                }
    //
    //                                if (els.get(i).children().tagName("p").tagName("em")!=null){
    //
    //                                    if (els.get(i).children().tagName("p").tagName("em").text().contains(URLEncoder.encode(MainActivity2.Companion.getWd(),"utf-8"))
    //                                            ||els.get(i).children().tagName("p").tagName("em").text().contains(MainActivity2.Companion.getWd())){
                                        MainActivity.Companion.webview2Load(els.get(i).attr("abs:href") .toString());
    //                                        Log.d(TAG+"333","p的em里面有"+ MainActivity2.Companion.getWd());
    //                                        if (StringUtils.StringIsNull(els.get(i).attr("abs:href") .toString())){
    //                                            if (isLoadOK = true){
    //                                                webViewLoad.loadWebUrl(els.get(i).attr("abs:href") .toString());
    //                                                isOK[0] = true;
    //                                                isChiledLoad = true ;
    //                                                break;
    //                                            }
    //                                        }
    //                                    }else {
    //                                        Log.d(TAG,"em.text()=="+ new String( els.get(i).children().tagName("p").tagName("em").toString()
    //                                                .getBytes("UTF-8") , "UTF-8"
    //                                        ));
    //
    //                                    }
    //
    //                                }
    //
    //
    //                            }
    //
    //                            if (els.get(i).children().tagName("h3") != null) {
    //                                Log.d(TAG+"22","H3上的test=="+els.get(i).children().tagName("h3").text());
    //                                if (els.get(i).children().tagName("h3").text().contains(URLEncoder.encode(MainActivity2.Companion.getWd(),"utf-8"))
    //                                        ||els.get(i).children().tagName("h3").text().contains(MainActivity2.Companion.getWd())){
                                        MainActivity.Companion.webview2Load(els.get(i).attr("abs:href") .toString());
    //                                    Log.d(TAG+"333","h3里面有"+ MainActivity2.Companion.getWd());
    //                                    if (StringUtils.StringIsNull(els.get(i).attr("abs:href") .toString())){
    //                                        if (isLoadOK = true){
    //                                            webViewLoad.loadWebUrl(els.get(i).attr("abs:href") .toString());
    //                                            isOK[0] = true;
    //                                            isChiledLoad = true ;
    //                                            break;
    //                                        }
    //                                    }
    //                                }else {
    //                                    Log.d(TAG,"h3.text()=="+new String(els.get(i).children().tagName("h3").toString()
    //                                            .getBytes("UTF-8") , "UTF-8"
    //                                    ));
    //
    //                                }
    //                                if (els.get(i).children().tagName("h3").tagName("em")!=null){
    //                                    if (els.get(i).children().tagName("h3").tagName("em").text().contains(URLEncoder.encode(MainActivity2.Companion.getWd(),"utf-8"))
    //                                            ||els.get(i).children().tagName("h3").tagName("em").text().contains(MainActivity2.Companion.getWd())
    //                                            ){
                                        MainActivity.Companion.webview2Load(els.get(i).attr("abs:href") .toString());
    //                                        Log.d(TAG+"333","h3的em里面有"+ MainActivity2.Companion.getWd());
    //                                        if (StringUtils.StringIsNull(els.get(i).attr("abs:href") .toString())){
    //                                            if (isLoadOK = true){
    //                                                webViewLoad.loadWebUrl(els.get(i).attr("abs:href") .toString());
    //                                                isOK[0] = true;
    //                                                isChiledLoad = true ;
    //                                                break;
    //                                            }
    //                                        }
    //                                    }else {
    //                                        Log.d(TAG,"em.text()=="+ new String( els.get(i).children().tagName("p").tagName("em").toString()
    //                                                .getBytes("UTF-8") , "UTF-8"
    //                                        ));
    //
    //                                    }
    //                                }
    //
    //                            }
    //                    }
    
                        doc = null;
    //                    els = null;
                        jsoup = null;
    
                    } catch (Exception e) {
                        e.printStackTrace();
                       getPageHtml(view,url);
                    }
                }
            }.start();
    
    // 在webview的webclient中重写onPageFinished方法中调用
      @Override
        public void onPageFinished(WebView view, String url) {
        view.getSettings().setJavaScriptEnabled(true);
          getPageHtml(view,url);
        } 
    
    }
    

    后面给webview设置调用自己定义好的webclient的方法很简单

    webview.webViewClient = MyWebViewClient5()

    这样一个Android的简单爬虫就可以了,我这里只是简单写了点提取数据的功能,你掌握了jsoup选择器的用法后可以提取更多你想要的网页数据!

    展开全文
  • 使用AgentWeb框架(使用系统webview也可参考这个问题),加载唯品会的网页https://m.vip.com/?source=www&amp;jump_https=1明明一开始成功了但最后出现“出错啦!点击空白处刷新~”的界面,原因是因为唯品会的...
  • 最近做Demo比较多,之前在搭网络框架的时候遇到了图片加载的问题,因为我以前的框架加载网络图片是没有问题,这次居然出问题,但是其实也不难解决吧。 异常问题 报错有两个 ① Failed to find ...
  • 运用XML解析技术实现动态的ANDROID页面加载功能,让ANDROID的企业级开发变得如编写网页一样简单。它主要由XML页面,启动主ACTIVITY处理逻辑类和主页面程序组成,极大的提高ANDROID的开发效率,动态加载页面灵活方便...
  • 安卓java读取网页源码 android插件化方案 一、前言 插件化的好处: 1.动态功能更新,可以进行动态添加新功能而无需用户下载安装应用 2.热修复,发现bug后,直接更新存在bug的插件,用户无需重新安装应用,甚至不需要...
  • 笔者最近使用AS开发Android移动应用app,其实有一个功能是使用Android系统自带的WebView控件加载网页代码来播放视频。 说两点容易出现的情况。 1、加载网页代码  WebView默认是不支持JavaScript 、IFrame或者是...
  • 这些组件在小数据量时简直不要太好用,然而有时我们将大量数据全部一次性加载到页面上,网页卡死了,除了懒加载,别无他法。 寻找灵感 Android应用里的列表浏览功能跟这个需要几乎一样,我们可以向下滑动浏览上万,...
  • 微信分享也是一项很常用的功能了,以往都是用友盟或者mobShareSDK框架来实现的,这两者在微信官方的sdk基础上封装的很好,并且加入了一些很实用性的功能,不过这次因为只有微信平台的分享,而且微信登录也是基于微信...
  • 链接传送网页和图片等资源)和优先级来缩短加载时间。 (2) 如果 SPDY 不可用,利用连接池减少请求延迟 (3) Gzip 压缩 (4) Response 缓存减少不必要的请求 Retrofit RESTFUL API 设计 项目地址: 文档介绍: 事件总线...
  • 如果电商类的网页,可以通过url告知客户端使用哪个插件并可以指定最低版本,然后客户端发现存在符合的插件就加载使用。如:http//www.baidu.com/a.php?p=zeusplugin_test&pversion=2,表示该页面使用z
  • 安卓java读取网页源码 Android 优秀开源项目汇总 ...加载反馈页管理框架 2.3k 3月 UI Loading 简单的 Loading 控件 2.5k 10月 UI 图表 统计图表库 31k 1月 UI 图表 统计图表库 7k 2年 UI 图表 自动生成表格
  • Android 入门第八讲01-WebView(WebView概述,基本用法(加载远程网页加载本地网页),进阶用法(前进返回,清除缓存,网页自适应屏幕,缩放),WebView的三个子类) 准备工作 第一步,添加权限 在mainifests里...
  • Google推出的Android异步网络请求框架和图片加载框架 二、JSON解析 1.Gson 一个Java序列化/反序列化库,可以将JSON和java对象互相转换,Google出品 2.Jackson Jackson可以轻松地将Java对象转换成json对象和xml文档,...
  • 1、前言:平时在android端用jsoup爬取网页数据时经常用到下拉刷新和上拉加载更多,逛了不少的博客、简书、也看了不少人家的优秀代码,发现了一个非常简单的方式,不敢独享所以发出来。2、用到的框架主要是这两个...
  • 这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的。我不希望在我写的应用里到处铺满sina的logo,我喜欢的效果是这样的: 这样干净利索,多好。 如果你也喜欢,那下面就一起来改造它...
  • PhoneGap框架

    2016-07-30 23:09:33
    但体验差,网页可能加载失败,不如本地框架流畅,如微信主体框架还是本地框架 在线更新方便,ios,android开发方便,如12306客户端完完全全h5网页, 将来网速和本地几乎完全一样,网页才会发挥它的巨大优势,这...
  • 运用XML解析技术实现动态的ANDROID页面加载功能,让ANDROID的企业级开发变得如编写网页一样简单。它主要由XML页面,启动主ACTIVITY处理逻辑类和主页面程序组成,极大的提高ANDROID的开发效率,动态加载页面灵活方便...
  • android简历app

    2018-05-12 15:13:50
    5、集成picasso图片加载框架; 6、集成takephoto从相机和相册获取图片框架; 7、集成Gson处理json数据; 8、集成okhttputils网络框架和okhttp日志拦截器; 9、集成Eventbus; 10、封装了一些通用工具类; 11、支付宝...
  • 修改WebView默认加载方式

    千次阅读 2015-12-14 16:59:12
    今天在做webview加载Jquery Mobile...浏览器中打开的,后来经查资料得知,原来Android中的WebView在加载网页的时候,默认是使用第三方框架或者系统自带的浏览器打开网页的,如果想让网页在webview加载则需 要重
  • Android WebView 详解简介作用加载Html的几种方式网页前进/后退清除缓存数据WebSettings类WebViewClient类WebChromeClient类WebView与JavaScript的交互Android调用JS(javascript)代码JS(javascript)调用Android代码...
  • Webview是谷歌提供一种加载网页的方式,随着H5的出现,越来越多的活动页面出现在Webview上,也出现React Native和Weex这样的H5框架。因此关于它,我们专门辟出来一节来讲讲。 缓存模式(5种) LOAD_CACHE_ONLY: 不...
  • 收藏的Android学习资源

    2015-09-01 15:29:00
    1. Android中混合开发系列 Android中Java与JavaScript的交互,可用来实现网页与本地APP的交互,信息的传递等; ...一个APK动态加载框架 理解Android Build系统 2. Android开发的其他系列 A...
  • 前不久用Android studio开发了一个生活工具类,用到了许多热门的第三方技术,为此整理一下,...Webview网页加载 CircleImageView裁剪图片 Bmob云 Bmob平台为您的移动应用提供了一个完整的后端解决方案...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 130
精华内容 52
关键字:

android网页加载框架