Android 浏览器开发WebView setBlockNetworkImage本末
含义本身防止网络数据图片
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
转载请注明出处:http://blog.csdn.net/lihui130135
版权声明:本文博主原创文章,博客,未经同意不得转载。
Android 浏览器开发WebView setBlockNetworkImage本末的更多相关文章
- android 浏览器开发实例
		
android app需要通过手机显示网页信息还是比较常用的,比如我最近业余开发的 抢商铺游戏,需要对游戏规则做说明,规则会比较多,而且要经常变动,就想到用网页来展示,更新起来方便,不像应用,一旦发布 ...
 - Android应用开发 WebView与服务器端的Js交互
		
最近公司再添加功能的时候,有一部分功能是用的html,在一个浏览器或webview中展示出html即可.当然在这里我们当然用webview控件喽 WebApp的好处: 在应用里嵌套web的好处有这么几 ...
 - Android使用开发WebView战斗技能
		
转载请注明出处:http://blog.csdn.net/allen315410/article/details/44619181 前段时间做项目的时候.在项目中用了WebView组件,遇到了一些问题 ...
 - android浏览器开发小技巧集锦(转)
		
本人和朋友们做了一段时间浏览器,将一些小技巧分享出来,先写一部分,慢慢写,同时也为我们的浏览器打打广告 我们的浏览器将要上线,名叫沙发浏览 1.网页内的右键菜单 public boolean onLo ...
 - Android 浏览器 —— 使用 WebView 实现文件下载
		
对当前的WebView设置下载监听 mCurrentWebView.setDownloadListener(new DownloadListener() { @Override public void ...
 - 分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告
		
分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 操作简单,傻瓜一看就会 无毒.无广告.无负作用,完全免费 下载地址1:http://awdjcfeizb.l33.yunpa ...
 - Android应用开发中webview上传文件的几种思路
		
1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...
 - Andriod开发之浏览器开发(WebView)
		
1.创建一个WebView在XML文件 <WebView android:id="@+id/webView" android:layout_width="match ...
 - android 下 利用webview实现浏览器功能
		
android 下 利用webview实现浏览器功能(一): 1.界面添加WEBVIEW控件. 2.在界面.JAVA代码页面(protected void onCreate(Bundle savedI ...
 
随机推荐
- javascript面向对象程序设计
			
在学习js面向对象编程之前,首先须要知道什么是面向对象.面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象.但js并没有类的概念,因此js中的对象和其它语言的对象有所不同. js对象能够 ...
 - POJ题目分类【实在是不知道哪个是原创了】
			
原地址:http://blog.csdn.net/liuqiyao_01/article/details/8477801 初期:一.基本算法: (1)枚举. (poj1753,poj2965) ...
 - WPF案例 (五) 对控件界面使用倒影
			
原文:WPF案例 (五) 对控件界面使用倒影 在这个程序里对5个2D控件界面应用了垂直倒影,边缘模糊化和模型变换,在本例中,这5个2D控件为Border, 各包含了一幅Image,界面如下图所示,源码 ...
 - commons.net.telnet使用示例
			
import org.apache.commons.net.telnet.TelnetClient; import java.io.IOException; public class TelnetDe ...
 - C++基础知识---static const初始化成员变量
			
为了限制常数的范围class中.你必须要做出成为class成员:而要确保这是丝毫不亚于有一个恒定的实体.你必须要做出成为static员: Class Gameplayer { Private: Sta ...
 - Android学习-各种对话框
			
在android的编程中,对话框的用处是非常多的,然而,有时对对话框的需求也是不一样的,那么现在,就总结对话框的种类,以及事件的处理形势. 1.简单的对话框 public void showDialo ...
 - XML,Object,Json分析转换Xstream采用
			
XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...
 - 2012Android开发热门资料(110个)
			
下载中心完整附件下载地址:http://down.51cto.com/data/412494 附件内容部分预览: 专题推荐: Android控:平板电脑HD精品游戏软件合集(共32个) http:// ...
 - Git管理工具对照(GitBash、EGit、SourceTree)
			
Git管理工具对照(GitBash.EGit.SourceTree) GitBash是採用命令行的方式对版本号进行管理,功能最为灵活强大,可是由于须要手动输入希望改动的文件名称,所以相对繁琐. EGi ...
 - linux设备驱动程序第四部分:从如何定位oops对代码的调试方法,驱动线
			
在一个我们谈到了如何编写一个简单的字符设备驱动程序,我们不是神,编写肯定会失败的代码,在这个过程中,我们需要继续写代码调试.在普通c应用.我们经常使用printf输出信息.或者使用gdb要调试程序,然 ...