博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 浏览器开发WebView setBlockNetworkImage本末
阅读量:5043 次
发布时间:2019-06-12

本文共 2938 字,大约阅读时间需要 9 分钟。

含义本身防止网络数据图片
webSettings.setBlockNetworkImage(true);
停止发布数据
webSettings.setBlockNetworkImage(false);
造成这么强大的功力
我们来看下详细的实现
WebSettingsClassic.java
    /**
     * @see android.webkit.WebSettings#setBlockNetworkImage(boolean)
     */
    @Override
    public synchronized void setBlockNetworkImage(boolean flag) {
        if (mBlockNetworkImage != flag) {
            mBlockNetworkImage = flag;
            postSync();
        }
    }
关键代码看上去仅仅有
mBlockNetworkImage = flag;
可是不要忽略了
postSync();
这个就是通知c++层去读取mBlockNetworkImage数值
我们看下详细的postSync函数实现
    /* Post a SYNC message to handle syncing the native settings. */
    private synchronized void postSync() {
        // Only post if a sync is not pending
        if (!mSyncPending) {
            mSyncPending = mEventHandler.sendMessage(
                    Message.obtain(null, EventHandler.SYNC));
        }
    }
通知给
            // create a new handler
            mHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    switch (msg.what) {
                        case SYNC:
                            synchronized (WebSettingsClassic.this) {
                                if (mBrowserFrame.mNativeFrame != 0) {
                                    nativeSync(mBrowserFrame.mNativeFrame);
                                }
                                mSyncPending = false;
                            }
                            break;
    // Synchronize the native and java settings.
    private native void nativeSync(int nativeFrame);
最后调用的函数
c++底层函数实现
WebKit/android/jni/WebSettings.cpp
//-------------------------------------------------------------
// JNI registration
//-------------------------------------------------------------
static JNINativeMethod gWebSettingsMethods[] = {
    { "nativeSync", "(I)V",
        (void*) WebSettings::Sync }
};
    static void Sync(JNIEnv* env, jobject obj, jint frame)
    {
        WebCore::Frame* pFrame = (WebCore::Frame*)frame;
        ALOG_ASSERT(pFrame, "%s must take a valid frame pointer!", __FUNCTION__);
        WebCore::Settings* s = pFrame->settings();
        if (!s)
            return;
        WebCore::CachedResourceLoader* cachedResourceLoader = pFrame->document()->cachedResourceLoader();
        flag = env->GetBooleanField(obj, gFieldIds->mBlockNetworkImage);
        s->setBlockNetworkImage(flag);
        if(!flag)
            cachedResourceLoader->setBlockNetworkImage(false);
   }
详细实现
CachedResourceLoader.cpp里面
void CachedResourceLoader::setBlockNetworkImage(bool block)
{
    if (block == m_blockNetworkImage)
        return;
    m_blockNetworkImage = block;
    if (!m_autoLoadImages || m_blockNetworkImage)
        return;
    DocumentResourceMap::iterator end = m_documentResources.end();
    for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != end; ++it) {
        CachedResource* resource = it->second.get();
        if (resource->type() == CachedResource::ImageResource) {
            CachedImage* image = const_cast<CachedImage*>(static_cast<const CachedImage*>(resource));
            image->setAutoLoadWasPreventedBySettings(false);
            if (image->stillNeedsLoad()) {
                image->setLoading(true);
                load(image, true);
            }
        }
    }
}
最终找到这个家伙了,原来搞了一个循环在呼呼的运行,发送一个个的网络请求
总体运行流程如今来看基本清晰了。

上面代码是针对android4.1.1版本号代码的分析

假设对这篇讲的技术有不论什么疑问,第一时间获得文章更新,每天公布一篇技术大牛的原创文章。很多其它技术信息分享。

欢迎关注个人微信公众平台:程序猿互动联盟,扫一扫下方二维码或搜索微信号coder_online就可以关注,在线帮您解决技术难点,给大牛直接出难题。

                                                              

联系方式

QQ:390012381

微信:donghuitalk

转载请注明出处:

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4867819.html

你可能感兴趣的文章
14.DNS:域名系统
查看>>
函数初识(函数的返回值,三元运算,函数的传参)
查看>>
object detection模型转换成TensorFlow Lite,在Android应用
查看>>
54.文件按大小切割
查看>>
fonts.useso.com 访问变慢
查看>>
【NGN学习笔记】3 软交换中的协议1--SIP、SIP-I/SIP-T/BICC
查看>>
nfs:server is not responding,still trying 原因与解决方案
查看>>
Linux程序前台后台切换
查看>>
Mysql-视图
查看>>
虚拟光驱导致无法安装光驱驱动的解决方法
查看>>
Jmeter_录制脚本时添加模板
查看>>
Zen Coding: 一种快速编写HTML/CSS代码的方法
查看>>
UI进阶之CALayer
查看>>
排序算法总结
查看>>
C# 求俩个正整数的最小公倍数和最大公约数
查看>>
OverTheWire Bandit
查看>>
关于替换 UIWebView 网络模块的一些初步想法
查看>>
SG函数
查看>>
用ListView实现新闻展示
查看>>
jquery知识点整理
查看>>