谁有奇闻怪事未解之迷的资料
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁有奇闻怪事未解之迷的资料相关的知识,希望对你有一定的参考价值。
链接: https://pan.baidu.com/s/1umbuTrq6KGsiMbGcbmBxeA
世界未解之谜
参考技术A 一、洛豪德岛的海盗遗产在澳大利亚,有一个名为洛豪德的小岛,该岛并非鸟语花香、景色宜人的胜地,然而, “岛不在美,有宝则名”。相传岛上藏有无数财宝,周围海底也铺满耀眼炫目的宝石。
17世纪70年代,一位名叫威廉·菲波斯的人,在偶然中发现一张有关洛豪德岛的地图,图上标有西班牙商船“黄金”号的沉没地,他惊喜若狂,感觉到一个发财的机会到来了。 原来,“黄金”号商船有一段神秘的故事,那是在16世纪50-70年代,西班牙人 沿着哥伦布的航迹远征美洲,从印地安人手里掠夺了无数金银珠宝,然后载满船舱回国。然而,他们的行动被海盗们觉察了。于是,海盗们疯狂袭击每一艘过往的商船,惨杀船员,抢 夺了大量财宝。如山沉重的财宝,海盗们无法全部带走,于是将剩余部分埋藏在洛豪德岛, 并绘制了藏宝图,海贼们发血誓表示严守秘密,以图永享这笔不义之财。哪知海盗们终归是 海盗,哪有信用可言,一些阴谋者企图独吞宝藏,一时间血肉横飞,一场火并留下了具具尸体,胜利者携带藏宝图混迹天下,过着花天酒地、骄奢淫逸的生活,而藏金岛的传说也不胫 而走,风靡世界。
菲波斯怀揣这张不知真假的藏宝图,登上荒岛,四处勘察,然而他一无所获。正当他徘徊海滩时,无意中脚陷入沙中,触及到一块异物,经发掘是一丛精美绝伦的大珊瑚,在珊瑚 内竟又藏有一只精致木箱,箱中盛满金币、银币和珍奇宝物。菲波斯狂喜万分,他在岛上待 了 3个月,疯狂地寻觅,整整30吨金银珠宝装满了他的纵帆船,他实现了发财梦。
一时间许多真真假假的 “藏宝图” 应运而生,充斥欧洲,高价出卖,不少发财狂们重金购买,不惜血本,结果呢?不少人或葬身海底,或暴死荒岛,或苦苦寻觅,久远踪影。海盗的遗产成了一个充满诱惑的谜团。
二、地下陵寝的宝藏
秘鲁政府近年宣布:对古印加奇姻王国首都废墟的地下国王陵墓加以严格保护,不允许 人们随便破坏它,并且在严密防卫下,由两位经验丰富的秘鲁考古学家花费几年时间在此地 挖掘。他们在寻找什么呢 ?
在 16世纪下叶,一位名叫古特尼茨的西班牙商人探险来到此地,他由一位印第安部落头人引路,穿过错综复杂、九曲十折的地下迷宫,来到这座地下的国王陵寝,瞬间,这位青年商人被金光灿烂的黄金珠宝照耀得不知所措,这座陵寝内摆设满珍奇珠宝,其中包括一些镶有翡翠眼睛并用黄金铸造的鱼,印第安头人平静地告诉面前这位惊恐万分的西班牙人,只要他协助建设当地的公共工程,这些黄金便全归他了。无须犹豫,这无疑是一个千载难逢的良机,古特尼茨拼命点头,于是,他如愿以偿以一个巨富的姿态返回西班牙。
至于古特尼茨捞得多少黄金可能永久成为未知数,但根据 1576年的西班牙税收记录 记载,古特尼茨不仅向国王密报了这处“小鱼”宝藏,而且慷慨地奉献了900磅黄金为税金,可见,他得到了多少财富。然而,在他之后的无数探宝者却没有这种运气,但总有人提供了激动人心的线索:在当地废墟下面,隐藏有一处“大鱼”宝藏,里面摆满更多陪葬的黄金物品。
此说真真假假,为陵寝蒙上了一层神秘的迷雾,而揭开这层迷雾,则有待于那两位秘鲁考古学家的运气了。
三、金银岛上埋藏的秘密
苏格兰作家斯蒂文森的著名小说《金银岛》讲述了一个脍炙人口的探险故事,主要说以 海盗和船长各自一帮人为争夺荒岛宝藏而展开了惊心动魄的拼斗,在尾声中,作者暗示仍有一大笔财宝隐藏在荒岛的某一处。
《金银岛》是以太平洋的可可岛为背景写的,该岛位于距哥斯达黎加海岸 300英里的 海中,曾是17世纪海盗的休息站,海盗们将掠夺的财宝在此装装卸卸,埋埋藏藏,为这个无名小岛平添了神秘色彩,据说岛上至少埋有6处宝藏,其中,最吸引寻宝者的是秘鲁利马的宝藏。1820年,利马市仍是西班牙的殖民地,当被称为“解放者”的秘鲁民族英雄玻利瓦尔所率领的革命军即将进攻利马,利马的西班牙总督仓皇出逃,他将多年搜刮的财宝,包括黄金烛台、金盘、真人般大小的圣母黄金铸像装上一艘“亲爱玛丽”号的帆船上逃走。不料,到了海上,船长见财起意,杀死了西班牙总督,为了安全起见,船长将财宝藏进了可 可岛上的一个神秘的洞穴内。在以后的日子里,他却又一直没有找到适当机会重返可可岛取走宝藏,直至1844年,船长离开人世,留下了一张难辨真伪的藏宝图。
这张图混杂在后来流传的形形色色的藏宝图中,诱惑着众多人前往可可岛,试图找到船 长的藏宝。也许太神秘,也许太虚假,也许太隐蔽,这些传说中的宝藏仍然不见天日,它依旧使人着魔。
1978年,一件意料不到的事情使所有寻宝者目瞪口呆,哥斯达黎加政府以保护生态 环境为理由,封闭了可可岛,严禁任何人挖掘。然而这之中又隐藏了一个怎样的新秘密呢? 那“金银岛”的宝藏会永远被埋藏吗?
四、“圣荷西”号沉船的珍宝
1708年5月28日,是一个晴朗的日子,一艘西班牙大帆船“圣荷西”号缓缓从巴 拿马启航,向西班牙领海驶去,这艘警备森严的船上载满着金条、银条、金币、金铸灯台、 祭坛用品的珠宝,这批宝藏据估计至少值10亿美元。当时,西班牙正与英国、荷兰等国处 于敌对状态,英国著名海军将领韦格正率领着一支强大的舰队在附近巡逻,危险会时时降临 。然而“圣荷西”号船长费德兹全然不顾,一则他回国心切,二则他过于迷信偶然性的幸运,竟天真地认为:大海何其广大,难道会这么巧遇上敌舰吗?
“圣荷西”号帆船平安行驶了几天,船长显得轻松自信了,直至6月8日,当人们惊恐 地发现前面海域上一字排开的英国舰队时,全都傻了眼,猛然间,炮火密布,水柱冲天,几 颗炮弹落在“圣荷西”号的甲板上,海水渐渐吞噬着这巨大的船体,“圣荷西”号连同600多名船员以及那无数珍宝沉往海底。沉落地点经无数寻宝者的测定,终于有了一个大概的结果:它大约在距哥伦比亚海岸约16英里的加勒比海740英尺深的海底。
俗话说: “近水楼台先得月。”1983年,哥伦比亚公共部长西格维亚正式庄严宣布:“圣荷西”号是哥伦比亚国的国家财产,不属于那些贪得无厌的寻宝者。人们估计,哥国 政府已经勘察出沉船的地点了,尽管打捞费用高达3000万美元,但它与这批宝藏相比就 算不了什么。今年,打捞可能开始进行了。结果如何,仍是未知数。 [/size]
淡紫守护者 2006-2-21 06:16
[size=4] 五、沉睡海底的黄金船队
“圣荷西”号船的沉没,对西班牙人来说并非先例,早在1702年,西班牙历史上著名的“黄金船队”就在大西洋维哥湾被英国人击沉,从而留下探宝史上一大遗案。
那时,西班牙财政困窘,一支由 17艘大帆船组成的庞大船队遵命载着从南美洲掠夺的 金银珠宝火速运回西班牙,其间将经过一段最危险的海域,在6月的一天,正当“黄金船队 ”驶到亚速尔群岛海面时,突然一支英、荷联合舰队拦住去路,这支150艘战舰组成的舰 队迫使“黄金船队”驶往维哥湾躲避。
面对强敌的包围,唯一而且最好的办法是从船上卸下财宝,从陆地运往西班牙首都马德 里,但偏偏当局有个奇怪的规定:凡从南美运来的东西必须首先到塞维利亚市验收。显然不 能违令从船上卸下珍宝,侥幸的是在皇后玛丽 ·德萨瓦的特别命令下,国王和皇后的金银珠 宝被卸下,改从陆地运往马德里。
在被围困了一个月后,英、荷联军约 3万人在鲁克海军上将指挥下对维哥湾发起猛攻,3115门重炮的轰击,摧毁了炮台和障碍栅,西班牙守军全线崩溃,由于联军被眼前无数 珍宝所激奋,战斗进展迅速,港湾很快沦隐,此时“黄金船队”总司令贝拉斯科绝望了,他下令烧毁运载金银珠宝的船只,瞬时间,维哥湾成为一片火海,除几艘帆船被英、荷联军及 时俘获外,绝大多数葬身海底。
这批财宝究竟有多少 ?据被俘的西班牙海军上将恰孔估计:约有4000~5000辆 马车的黄金珠宝沉入了海底。尽管英国人冒险多次潜入海下,也仅捞上很少的战利品。于是 ,这批宝藏强烈吸引着无数寻宝者。从此,在近1000海里的海底,出现了一批批冒险家 的身影,他们有的捞起已空空如也的沉船,有的却得到了纯绿宝石、紫水晶、珍珠、黑琥珀等珠宝翡翠,有的仍用现代化技术和工具继续寻觅。随着岁月推移,风浪海潮已使宝藏蒙上厚厚泥沙,众多传闻又使宝藏增添了几分神秘,无疑给冒险带来了太多的麻烦。
不幸的是那部分由陆地运往马德里的财宝,在途中有一部分被强盗抢走。这部分约 15 00辆马车的黄金,据说至今仍被埋藏在西班牙庞特维德拉山区的一个鲜为人知的地方,这 显然又像一块巨大的磁铁吸引着梦想发财的人们。
六、亚马逊密林的黄金城
在古代,有一个以南美秘鲁为心的印加帝国,十分强盛,京城内所有的宫殿和神殿都是 用大量金银装饰而成,金碧辉煌,灿烂无比。 16世纪初,西班牙人推翻了印加帝国,掠夺了所有黄金宝石,西班牙统帅庇萨罗听说印加帝国的黄金全是从一个叫帕蒂的酋长统治的玛 诺阿国运来的,而且那里金银财宝堆积如山,庇萨罗立即组织探险队,开赴位于亚马逊密林 深处的黄金城。然而在这个广袤无垠的原始森林里,每前进一步都意味着恐惧和死亡,这里 有猛兽毒蛇,有野蛮的食人部落,有迷失道路和威胁,一支支探险队或失望而归,或下落不明,使庇萨罗遥望这片森林只有以想象自慰了。
随后,西班牙人、葡萄牙人、英国人、荷兰人和德国人风闻黄金城的消息,谁都想一攫千金,于是蜂拥而至,深入亚马逊密林。其中,有位叫凯萨达的西班牙人率领约 716名探 险队员向黄金城进发,在付出550条性命的惨重代价后,终于在康迪那玛尔加平原发现了 黄金城和传说中的黄金湖,找到了价值300万美元的翡翠宝石,然而这仅是黄金城难以估价的财宝中的微小部分。
传说中的黄金湖就是哥伦比亚的瓜达维达湖。在 17世纪初时,一位印第安族最后一位 国王的侄儿向人们描述了在黄金湖畔所举行的传统加冕仪式:当时,王位继承人全身被涂上金粉,如同黄金塑就,然后在湖中畅游,洗去金粉,他的臣民纷纷献上黄金、翡翠,堆在他 的脚旁,这位新国王将所有黄金丢进湖中,作为对上帝的奉献,这种传统仪式举行过无数次 ,可见黄金湖的蕴藏量对人们的诱惑了。
从 16世纪以来,对黄金湖的打捞一直没有停止过。1545年一支由西班牙人组织的 寻宝队,在3个月时间内就从较浅的湖底捞起几百件黄金用品。1911年,英国一家公司挖了一条地道,将湖水抽干了,但太阳很快地把厚厚的泥浆晒成干硬的泥板,当英国人再从 英国运来钻探设备时,湖中再度充满湖水,这次代价巨昂的打捞归于失败。
1974年,哥伦比亚政府担心湖中宝藏落入他人之手,出动军队来保护这个黄金湖, 从此再也无人能够接近这批宝藏。于是,神秘的黄金湖便成为一个无法揭开的谜底了。
七、神秘失踪的第八奇观
18世纪初,以追求豪华生活而著称的普鲁士国王腓特烈一世心血来潮,异想天开,建造了被他称为世界第八奇观的琥珀屋。
琥珀屋约 55平方米,全部用琥珀板镶成,室内的装饰板也全部用带银箔的琥珀板镶成 ,堪称旷世珍宝,世界一绝。不久,为了讨好俄国,腓特烈一世将这稀世之宝作为礼物送给彼得大帝。
彼得大帝病逝,继位的女皇又对琥珀屋加以扩整,使之更加精美、珍贵、华丽,成为皇 宫里的一颗灿烂明珠。二次大战期间,德军占领苏联,一个以掠夺文物为目的的法西斯组织将琥珀屋拆卸装箱 运住柯尼斯堡。战后,苏联的一个寻找琥珀屋的组织根据一个德国人的指点,在波罗的海水 中打捞起 17个箱子,可是,箱内装的不是琥珀屋,而是滚珠和轴承。在重新研究大量材料时,寻宝人员发现德国一位研究琥珀极有造诣的艺术教授罗德博士 是位知情人,原来罗德不仅从纳粹手中接收了琥珀屋,并亲自为它编排目录,举办过小范围 展览,而且在法西斯失败前曾下令拆卸琥珀屋,但是,罗德对琥珀屋的确切收藏位置模糊不 清,正当他继续考虑线索时却不明不白的暴死了。搜寻队又将线索转向一位名叫库尔任科的 苏联妇女身上,她曾与罗德一块共事,并负责保管被认为是包括琥珀屋在内的艺术展品。
这位妇女回忆说:在德军撤退时,一群军人曾歇斯底里地破坏这些艺术品,接着城市又 燃起了熊熊大火,那些展品和放置它们的城堡被烧成一片灰烬。因此出现这样一个问题:琥 珀屋是否就混同在这批艺术品中 ?
线索中断了,但并没有阻止搜寻队的行动,而且不少德国人也纷纷协助寻找琥珀屋,一家图文并茂的杂志甚至登出广告,号召人们提供有关琥珀屋的线索,一时间,从柏林、莱比 锡、慕尼黑、汉堡等地来的信件犹如雪片飞向编辑部。
一位青年提供了一条有价值的情报,他的父亲乔治 ·林格尔曾是纳粹的军官,具体过问 并执行了掩藏琥珀屋的命令,并在生前曾亲口告之,琥珀屋藏在一个名为斯泰因达姆的地下 室。这份情报又给人注射了一针兴奋剂,搜寻队推断,琥珀屋至今未转移出罗德博士所在的 那座城市,也许它仍在一个地下室静静地沉睡着,揭开琥珀屋之谜是件不易的事情。
八、葬于海底的加州金矿
公元 1849年,美国加州发现金矿,一时间便掀起淘金热,西部和东部的冒险者云集 此,为一寸矿地而争夺,火并、流血整整8年后,一群群人带着用血汗换来的黄金,准备回 家,结束这种残酷危险的日子。
一大群淘金者风尘仆仆,带着他们的妻子、孩子,辗转万里,开始了又一种恐惧的行程 。他们从旧金山搭船到巴拿马,再搭骡车横越巴拿马地峡,最后乘船驶往纽约。这群人离开巴拿马两天后,也就是 1857年9月10日,所乘坐的“中美”号汽船遇 上了意料不到的灾难,这艘小小的汽船有750余人,吃水太紧,加上遇到飓风,狂风暴雨 的袭击使船舱破裂,海水漏了进来。人们发现船帆被强风吹断,锅炉的火熄灭了,一望无际 的大海使这群人感到绝望。他们组成自救队,妇女和儿童被送上救生艇,全部获救,但42 3名淘金汉连同那无法估量的黄金葬身海底。那些幸存者们个个已无法确定沉船的准确方位 ,这批加州黄金宝藏的下落成为一个谜团。
一位著名的寻宝专家名叫史宾赛,他曾有过寻获几艘在美国内战中沉没船只的成绩,对 这艘载有黄金的 “中美”号汽船表示了强烈兴趣,目前,他已花费了15年时间来寻找“中 美”号,并深信已找到该船沉落的确切地点,并希望在两年内打捞出这批黄金。史宾赛似乎为解开加州宝藏之谜带来一线光明。
九、变化莫测的钱坑宝藏
名作家马克 ·吐温在《汤姆历险记》中描述说,海盗的宝藏都是装在破木箱里,埋在老枯树下,半夜时,这棵树的树枝阴影所落下的地方就是藏宝地,这类情景几乎就是“钱坑” 宝藏的再版。
1795年10月,三位少年登上离加拿大仅3英里处的橡树岛旅游,他们发现朝海一 面的大片红橡树林中突然出现空旷地,地中间独立着一颗古橡树,树枝上似乎挂过一个古船的吊滑车,正下方有一个浅坑,根据迹象判断,这里可能埋有海盗的宝藏。
原来,橡树岛在 17世纪时是海盗出没之地,有一个著名海盗叫威廉·基特,1701 年他在伦敦被处决,临死前提出一个交换条件:若他能免一死,愿告诉一个埋宝地方。但他 被遭到拒绝,连同那个宝藏一道被送进阴间。
那么,基特的宝藏是否就是埋在此地呢 ! 三位少年开始挖掘,发现那坑像个枯井,每融10英尺就碰到一块橡木板,最终毫无结 果。1803年,又一群人继续挖掘,当挖到90英尺深时,发现了一块刻有神秘符号的石板,经专家破译,意思是:在此下面40英尺埋藏了2000万英镑。人们欣喜若狂,他们 一边抽水一边挖掘,在一天晚上用标杆探底时,在98英尺深处触及到类似箱子的硬物,当 即大伙谈起了宝藏分配,可是第二天,人们惊讶地发现,坑内积水已达60英尺深,于是希 望成为泡影。
仍不死心的掘宝者又陆续做过 15次挖掘,耗资300万美元。在1850年时,人们 又有个奇怪的发现,退潮时,“钱坑”东面500英尺处海滩上不断冒出水,犹如吸满水的 海绵不断受挤压一样,同时又发现了一套精巧复杂的通向“钱坑”的引水系统,它们使“钱 坑”变成一个蓄水坑。
于是人们作出一个推论:海盗将钱坑挖得很深,然后从深处倒过来挖出斜向地现的侧井,宝藏可能离 “钱坑 ”几百英尺远而埋在斜井尽头,离地面不过30英尺深,这使海盗们可以迷惑掘宝者而自己又能轻易挖出宝藏。
1897年人们又在155英尺深处挖出一件羊皮纸卷,上用鹅毛笔写着二封信,有的 人还挖出了铁板,这些发现更使人相信:海盗们埋了一笔巨大财富,20世纪时人们估计有1000万美元,在60年代,便传说有1亿多美元了。在“钱坑”挖掘时,曾有一个传说:必须死掉7个人才能揭开其秘密,到目前,已有6人在企图到达坑底途中丧生。看来,真正秘密的揭开已为期不远了。
现在,一个由加拿大和美国人组成的联合公司正在对 “钱坑”进行前所未有的大规模发掘,在岛中心投资1000万美元钻了一口巨井,高达20层楼,并在其他地方钻了200 个洞,有的达165英尺深,已接近岩层;钻头从地下带出了金属制品、瓷器、水泥等物, 这家公司格外卖力,计划再挖一口直径为80英尺、深200英尺的大井,并预备了足够的抽水泵,看样子,他们准备将橡树岛翻个底朝天。
原来,他们推测可能有几十亿美元埋在地下,这大概是力量和耐心的真正源泉。
“钱坑”之谜的揭晓为期不远了,它可能犹如埃及图特王陵墓一般举世震惊,它也可能 是一个耗费巨资掘出的空洞。
十、恐怖的亚利桑纳州金矿
在美国亚利桑纳州,有一个称为迷信山的山区,这里荒草丛生,怪石峥嵘,猛兽出没,到处是凶狠的响尾蛇。在山中的某一个不知名的地方,有座被人们称为 “迷失荷兰人金矿 ”吸引着无畏的探险者们。
1840年末,一位名叫伯拦塔的探险人深入山区,几经艰险,终于发现一处矿藏丰富的金矿,他仔细地作了标记,以便终生受用,从此很多探宝人一直想找出这处金矿,但很多人不幸葬身荒野,有些人则在途中惨遭印第安人们的伏击而身亡,在通往黄金通路上障碍重重,充满恐怖的气氛。
后来有一位德国探险者华兹终于找到了这处金矿,他经常在山上待上两三天,然后神秘地潜回老家,每次总会捎上几袋高品质的金矿。知道这个金矿地点的还有他的两个同伴,但是他俩全被人神秘地杀害了,凶手是谁 ?不得而知,大概和这座金矿一样成为永久的秘密。
1891年,华兹死于肺炎,他在临终前画了一张地图,标明了这处金矿的位置。1931年,一位名叫鲁斯的男子通过种种途径弄到了这张不知真伪的地图,于是他携带地图,进入了迷信山山区,然而他却一去不返,6个月后,有人在山区发现了他的头颅,头上中了 两枪,样子很惨 ,可以想象他一定被一种极为可怕的景象吓呆了,那么杀手又是何人呢? 1959年,又有3位探险者在这处山区遇害,是谁杀了他们呢?无论怎样,凶手肯定是金矿的知情人,他们试图保留这不成为秘密的秘密,然而,这一切阻止不了倔强的寻宝人,因而,探险者的身影、枪声、腥血、响尾蛇、荒野的呼啸构成了亚利桑纳金矿恐怖的色调。笼罩在迷信山山区的迷雾更加使人混沌不安。
这些尚未出土的十大宝藏,是世界上千千万万个已知或未知宝藏的一部分,它们是已经产生或未产生的惊险故事的线索,无疑,它给人以惊喜、疑虑、遗憾和悲伤.本回答被提问者采纳 参考技术B 老普利尼是一位记述过“人鱼”生物的自然科学家,在他的不朽著作《自然历史》中写到:“至于美人鱼,也叫做尼厄丽德,这并非难以置信……她们是真实的,只不过身体粗糙,遍体有鳞,甚至象女人的那些部位也有鳞片。”
1990年4月《文汇报》有这样一则报道:一些科学家正在竭力设法找到这一当今考古学最惊人的发现,一个3000年前美人鱼的木乃伊遗体的由来。一队建筑工人,在索契城外的黑海岸边附近的一个放置宝物的坟墓里,发现了这一难以相信的生物。这一发现的消息是由苏联考古学家耶里米亚博士在最近透露给西方的。她看起来像一个美丽的黑皮肤公主,下面有一条鱼尾巴。这一惊人的生物从头顶到带鳞的尾巴,计长有173厘米。科学家相信她死时约有100多岁的年龄。
1991年7月2日,新加坡《联合日报》发表了题为《南斯拉夫海岸发现1.2万年前美人鱼化石》的报道:科学家们最近发掘到世界首具完整的美人鱼化石,证实了这种以往只在童话中出现的动物,的确曾在真实世界里存在过。化石是在南斯拉夫海岸发现的。化石保存得很完整,能够清楚见到这种动物拥有锋利的牙齿,还有强壮的双颚,足以撕肉碎骨,将猎物杀死。“这只动物是雌性的。大概1.2万年前在附近海岸出现。”柏列·奥干尼博士说。奥干尼博士是一名来自美国加州的考古学家,在美人鱼出现的海域工作了4年。奥干尼博士说:“它在一次水底山泥倾泻时活埋,然后被周围的石灰石所保护,而慢慢转为化石。化石显示,美人鱼高160厘米,腰部以上像人类,头部发达,脑体积相当大,双手有利爪,眼睛跟其他鱼类一样,无有眼帘。
上半身是人下半身是鱼的
1991年8月,美国两名渔民发现人鱼事件,报道如下:最近美国两名职业捕鲨高手在加勒比海海域捕到十一条鲨鱼,其中有一条虎鲨长18.3米,当渔民解剖这条虎鲨时,在它的腹内胃里发现了一副异常奇怪的骸骨骨架,骸骨上身三分之一象成年人的骨骼,但从骨盆开始却是一条大鱼的骨骼。当时渔民将之转交警方,警方立即通知验尸官进行检验,检验结果证实是一种半人半鱼的生物。对于这副奇特的骨骼,警方又请专家进一步研究,并将资料输入电脑,根据骨骼形状绘制出了美人鱼形状。参加这项工作的美国埃毁斯度博士说,从他们所掌握的证据来看,美人鱼并不是传说或虚构出来的生物,而是世界上确实存在的一种生物。
上半身是鱼下半身是人的
科威特的《火炬报》在1980年8月24日报道:最近,在红海海岸发现了生物公园的一个奇迹--美人鱼。美人鱼的形状上半身如鱼,下半身象女人的形体----跟人一样长着两条腿和十个脚趾。可惜的是,它被发现时已经死了。……关于对活人鱼的发现也是有的。1962年曾发生过一起科学家活捉小人鱼的事件。英国的《太阳报》,中国哈尔滨的《新晚报》及其它许多家报刊对此事进行了报道。前苏联列宁科学院维诺葛雷德博士讲述了经过:1962年,一艘载有科学家和军事专家的探测船,在古巴外海捕获一个能讲人语的小孩,皮肤呈鳞状,有鳃,头似人,尾似鱼。小人鱼称自己来自亚特兰蒂斯市,还告诉研究人员在几百万年前,亚特兰蒂斯大陆横跨非洲和南美,后来沉入海底……现在留存下来的人居于海底,寿命达300岁。后来小人鱼被送往黑海一处秘密研究机构里,供科学家们深入研究。
其它有关发现
1958年,美国国家海洋学会的罗坦博士,在大西洋5公里深的海底,摄到一些类似人的海底足迹。
1963年,在波多黎各东南海底,美国海军潜艇演习时,发现了一条怪船,时速280公里,无法追踪,人类现代科技望尘莫及。1968年,美国摄影师穆尼,在海底附近发现怪物,脸像猴子,脖子比人长四倍,眼睛像人但要大得多,腿部有快速“推进器”。1938年,人们曾在爱沙尼亚的朱明达海滩上,发现“蛤蟆人”,鸡胸、扁嘴、圆脑袋,飞快跳进波罗的海里。诸如“人鱼”这类海底奇异生物的存在由于有了实物作证,那么它也就由人们所谓的“荒诞”、“迷信”、“神话”的东西转变为当前一项严肃的科学研究课题了。 参考技术C 未解之谜
未解之谜就是人们用现有的科学技术手段,或者按照正常的思维逻辑以及推理方式无法解释的自然、天文、历史等现象。
编辑本段世界十大未解之谜
一、神秘宝藏之谜
沙皇500吨黄金之谜
石达开藏宝之谜
慈禧的满棺珍宝流向何处
“红色处女军”藏宝之谜
隆美尔巨额黄金之谜
澳大利亚藏金岛之谜
“圣殿骑士团”的宝藏
法国海盗流传下来的神秘藏宝图
张献忠万万两金银之谜
二、人类未解之谜
人类究竟从那里来
人类的智慧从那里来
艾滋病毒来自何方
人的头颅可以移植吗
人体的潜力之谜
人体自然之谜
……
三、考古未解之谜
秦始皇墓之谜
中国文字因何现身美洲
金字塔中的重重谜团
消失的楼兰古城
失踪千年的罗马古城
通天塔的秘密
蕴含玄机的奥梅克雕像
开封地下城叠城
……
四、历史文化之谜
淹没在千年积雪下的诺亚方舟
玛雅文明神秘消失之谜
《圣经》中都藏有什么秘密
比金字塔更神秘的巨石阵
谁是日本第一代天皇
耶稣是人还是神
拿破仑死亡之谜
希特勒的性别之谜
五、天外来客之谜
善恶难定的外星人
外星人的来访
外星人来自何方
外星人为何不愿直接与地球人来往
玛雅人是不是天外来客
外星人的“交配实验”
UFO是美国国防部的无人侦察机?
4千年前的“死丘事件”
美国保留有外星人的遗体?!
……
六、宇宙未解之谜
月球起源之谜
月球并没有绕着地球转!
最神秘的宇宙之谜——黑洞
美国登月照片发现疑点
恒星产生之谜
宇宙中的黄金
神秘天体绕太阳运行
火星上的金字塔之谜
……
七、动物未解之谜
地球上还有活着的恐龙!
人类始祖是恐龙吗?
中国九头鸟之谜
神秘的蚂蚁王国
虎狮之争之谜
海洋巨蟒之谜
神秘的海妖
鲸鱼自杀之谜
……
八、植物未解之谜
树的年轮之谜
植物神秘的心灵感应
植物能接收太空发来的信号
植物也有喜、怒、哀、乐
南非吃人树之谜
植物吃动物之谜
植物的防御武器之谜
……
九、地球未解之谜
“失踪”的大西洲
北纬30度线上的“死亡区域”
罗布泊之谜
海底金字塔之谜
消失在太平洋中的古大陆
古人是否还活在百幕大海底
日本人谈虎色变的死亡之海
百幕大魔鬼区域水下早外星人的基地?
……
十、自然未解之谜
唐山地震七大谜团
地球光环之谜
恐怖的死亡公路
百年谜团——通古斯大爆炸
听到九年前的激战
黑色闪电之谜
破解人类部分未解之谜
生命从何时开始?宇宙究竟由什么物质组成?为什么我们需要睡眠?科学已经有了飞跃式发展,但直到今天,我们仍有许多难题没有找到答案。
1 地球的核心是什么?
地心距离地球表面还有4000英里(1英里约合1.61公里),那里有一个月球那么大的固体铁球。
我们都生活在厚达1800英里的岩石层上,这些岩石层形成了地球的外壳和地表的覆盖物。那么,地心和地壳之间有什么物质呢?是一片岩浆,但科学家不能确定这片岩浆具体由何种物质组成,以及会对周围环境产生怎样的影响。
2 时间是持续不断的吗?
柏拉图认为时间是持续不断的。而爱因斯坦认为时间只是另一种尺度,是除了上下、左右、前后之外的第四维。爱因斯坦的时空概念理论上行得通,但实际却很难办到。因为我们只能沿着时间轴朝一个方向走。最终,一定会有人能够得出正确的结论,只不过是时间问题。
3 生命从何而来?
“物竞天择,适者生存”,自然选择学说解释了生物体为了适应环境的改变,是如何进化来的。但达尔文的理论却不能解释第一个生物体是如何产生的。是没有任何生命迹象的化合物最初创造了生命吗?第一个生命体是如何被装配起来的?大自然连一点点微小的暗示都没有给出。
4 什么导致了冰河时期?
小规模的冰河时期每2—4万年发生一次,大规模的每10万年发生一次。科学家认为,地球轨道的不规则性改变了它吸收能量的多少,导致地球突然冷却。但研究表明,地球轨道的不规则性对地球吸收太阳能的影响只占其中的1%,这个微小的影响是如何使地球的气候产生重大突变呢?
5 为什么要解码DNA?
一个典型的人类细胞中含有6英尺(1英尺约合0.3米)长的DNA,但只有1英寸(1英寸约合2.54厘米)的DNA携有需要被用来制造蛋白质的密码,其他部分究竟是什么呢?诺贝尔奖获得者布瑞纳研究后发现,它们是废品。但生物学家认为这些所谓的废品DNA中也包含有“财富”。
6 森林如何影响全球变暖?
每个人都知道森林有助于环境的改善。树木在生长的过程中会吸收导致全球变暖的罪魁祸首二氧化碳,但即便这样,地球仍在不断升温。于是产生了这样一个矛盾——未来,森林并不能减缓气候的变化,但随着森林不断遭受毁坏,全球变暖将更严峻。
7 大脑如何计算运动?
大脑在处理运动规则方面速度较慢,将手置于一个热的盘子上,它需要数个毫秒才能感觉到热,那么大脑是如何在短时间内同时获得视觉数据,产生指令身体动作的信息,计算出一个精确的轨道使蜥蜴的舌头瞬间捕捉到苍蝇,使我们的手迅速抓住正在下落的玻璃杯呢?
8 为什么地球两极会换位?
大约80万年前,指南针会指向南方,早些时期,它会指向北方。当地球自转时,内核中的液体金属搅拌在一起,产生一个电磁场。自转导致的内核运动方向的改变会改变这个电磁场的两极。一旦异位过程开始,地球需要7000年时间才能完成这一南北颠倒的重大改变。在100万年中这种情况平均会发生2—3次,但没有人知道它是如何实现的。
9 黑洞信息去哪里了?
黑洞里面的吸引力非常强大,任何物质或能量都不能逃脱黑洞的吸引。但物理学家霍金却说某种东西可以逃脱黑洞的引力,这种东西就是“霍金辐射”这样的随机粒子。如果黑洞可以把具有固定结构的物质吃掉的话,那么黑洞就会充满各种信息然后发出不确定的各种各样的噪声,那么这些信息去哪里了?
10 我们为什么不能预报天气?
气象学家劳伦兹在进行一项计算机天气模拟时,决定对其中的一个参量采用四舍五入进行计算。这个小小的变化完全改变了天气模型,这成为后来著名的“蝴蝶效应”。劳伦兹的这种做法启发气象学家把尽可能精确的数据输入计算机模型以扩大他们的预测区间。但极为精确的数据也不能使我们获得精确的长期性预测结果。气候学家还需要了解大气和海洋的交互性影响等多种影响天气的因素。因此,预报数十年后或数世纪后的天气,基本上是不可能的。
11 为什么疾病会流行?
一种流行性疾病实际上只是一种病原体“鸿运当头”的外在表现。细菌如何实现感染取决于它们是怎样工作的以及人类抵抗能力如何。但没有人知道如何预测那些细菌何时在人群中传播,所以不要忘记经常洗手。
12 重力是如何产生的?
牛顿首先发现了万有引力的基本性质。他向世人揭开了天体和人类不会从地球上掉下去的奥秘。然而我们只是理解万有引力现象,而对其产生原因的研究几乎没有任何进展。
13 为什么我们的器官不能再生?
拿菜刀从你手指上切下去,这根手指就会永远跟你说再见。然而把蝾螈的一条腿砍下,它却会自然地长出一条新腿。我们会因为指甲受到损伤而大惊小怪,而动物器官的重生过程却是那么自然。科学家想知道为什么“无所不能”的人类却不能做到这一点。
14 数学家可以证明黎曼猜想吗?
20世纪早期,德国数学家希尔伯特曾说,如果他在沉睡1000年后醒来,他将问的第一个问题便是:黎曼猜想得到证明了吗?现在100多年过去了,这个问题至今仍没答案。黎曼猜想将在所谓的黎曼zeta函数基础上对零分配。该猜想已被美国克雷数学研究所列为世界黄金问题之一,能证明或证伪该猜想的人将会获得100万美元的奖金。
15 为什么我们会死亡?
当物理学家被问到事物为何死亡这种问题时,他们会毫不犹豫地回答说这符合热力学第二定律。任何事物,无论它是矿物质、动植物,还是一辆汽车最终都会分解消亡。这种现象发生在人类身上就是使人变老。变老的原因可能因为DNA遭到了损害,也可能是因为染色体端粒发生萎缩。若想知道生命何时终结,还要求助于生态学家,但他们只是粗略预测,不能准确地预测一个人的死亡时间。 参考技术D http://tech.qq.com/zt/2006/wjzm/
这里面介绍得很详细!~
参考资料:http://tech.qq.com/zt/2006/wjzm/
走进RecyclerView未解之迷 ------ 原理和优化
(前言暂位符号)
View holder究竟是什么?
Problem
- View holder 和 item view 是什么关系? 一对一?一对多?多对一?
- View holder 解决的是什么问题?
- View holder 和 ListView 的 item view 的复用有什么关系?
没有实现 View holder 的 getView()
的例子如下,大量的 findViewById()
方法被调用,看似不是很大的开销,但其方法的底层实现是深度优先搜索,时间复杂度是O(n)。
完全可以避免以上不必要开支,见下例子,通过setTag()
、getTag()
复用view,只有在第一次convertView为空的时候去创建ViewHolder,并调用findViewById
将convertView中的view赋值到holder中,并且将holder存起来留给下次复用,避免重复找view操作。这也是 ViewHolder名字的来历:用来保存View的容器。
setTag()
为什么可以绑定convertView和holder?其实这里的内部实现很简单,把任意一个对象Object作为参数(成员变量)存到View当中,另一种方法则是用Key、Value的方式进行绑定。
ANSWER
-
Item view 和 view holder 是一一对应的关系;
-
View holder解决的是防止重复进行
findViewById
,提升效率; -
没什么关系,对比以上2个例子,第一个效率不高的
getView()
方法中可见即使没有使用View holder的存在,但是通过convertView的空判断选择创建或直接findViewById
,这就是在复用,只是比较耗性能!
ViewHolder的最佳实践
ViewType种类过多,尽量减少在onBindViewHolder(VireHolder holder, int position)
里if else的冗杂判断,可将具体的数据绑定逻辑放到 ViewHolder内部。
缓存机制
1. ListView
如下图,RecyclerBin是ListView的回收站,专门负责管理ListView的缓存。RecyclerBin中有两层缓存:
- Active View:活跃View,正在屏幕中展示的View;
- Scrap View:废弃View,已经从屏幕移出去的item view,已经被回收掉了;
结合下图理解,当ListView需要创建一个view,也就是Adapter.getView时,首先从两层缓存中找,如果没有就创建一个view返回。
结合下图再来加深一下ListView的二层缓存理解:屏幕内外的View,和复用、缓存有什么关系?
Android系统的屏幕刷新机制16.6ms/1帧,每次刷新的时候会把最新的View渲染到屏幕上,也就是说在下一帧画面时,ListView会将**屏幕上所有的item**的数据清空,再根据最新的业务逻辑状态结合ListView内部机制(及layout、draw等等),重新绘制到屏幕上。
那么,被清空的这些item呢?例如滑动列表,数据没变,只是item的位置改变!因此这些item view是可以拿回来继续复用的,并不需要重新bind数据,即ListView直接跳过adapter.getView步骤的。正因为ListView内部已经处理过了,也无需开发者在getView中处理这些逻辑。
诶嘿,上述讲解还有一个重点:凡是跳过getView
方法的item不需要重新bind数据,那么执行过getView
方法的item view是肯定要重新bind数据的!
再来看Srap View,上滑动列表后,右再回到原来位置,这时ListView会在Scrap View,即被废弃的View中找到item view,既然是脏数据,找到后就需要重新bind数据。(注:如果脏数据中没有找到,就重新创建)
留一个问题:Srap View内部使用的什么数据结构?
2. RecyclerView
如下图,这对比起来相较于ListView似乎复杂了些,但其实二者还是有些许相同之处,只是RV的缓存机制更加完善高效。
RecyclerView内部是由Recycler来管理缓存机制,注意:RecyclerView和ListView缓存本质上很重要的一点差异,前者缓存的是ViewHolder、而后者缓存的是View对象!但是但是,在文章一开始我们就分析过ViewHolder和item view的关系,一一对应,相互绑定的,其实差别也不大。
RV接收到创建一个item view的需求时,首先从四层缓存中找,没找到才会去创建。来看这四层缓存:
- Scrap: 虽然名字叫“废弃”,但实则对标ListView中的Active View,即屏幕内的item view;
- Cache: 同上,对标于ListView中的Scrap View,即屏幕外的item view;
- ViewCacheExtension:(用户自定义过,才会走这层,否则直接跳过)
- RecycledViewPool: Pool池子,看到这个定义不由得想起线程池,其实也是一个类似概念;
从下图屏幕的角度,来理解这四层缓存:
首先来看第一层 Scrap,即屏幕内的item view,回顾ListView讲解的缓存内容,这部分是可以直接被复用的。注意:这类型“可以直接被复用的view” 是通过数据集的position来查找对应的viewholder。例如在滑动的过程中需要position为5的view(注意:position为5的item view一直在屏幕内的!只是每次刷新数据重新渲染),这时可以直接去Scrap干净数据中找,直接拿来复用,跳过bind数据步骤。
再来看第二层 Cache,即刚移出屏幕的item view,直接被回收到Cache,再拿来复用时就需要重新bind数据。例如往上滑动列表,position为2、3的item view被移出屏幕(被回收到Cache),再往下滑,position为2、3的item view在Cache中找到拿回来复用。同Scrap一样,也是通过position找到viewholder,直接拿回来复用,无需重新bind数据,即跳过onBindViewHolder
方法。
第三层 ViewCacheExtension,说实话使用场景很少,估计很多人闻所未闻,其API设计更是有些奇怪,要知道RecyclerView的缓存机制目标是ViewHolder,读取ViewHolder中有效信息(可从它获取item view)。但是ViewCacheExtension源码自行实现返回的对象却是item view,那ViewHolder?ViewCacheExtension内部还会去检查item view 是否绑定ViewHolder,没有绑定则直接crash。
第四层 RecycledViewPool ,内部保存的都是被废弃的脏(dirty)数据,通过viewType 找到对应数据后需要重新绑定数据(注意这一层缓存是通过viewType查找),即虽然缓存读取跳过了onCreateViewHolder
步骤,但是需要重新绑定数据onBindViewHolder
。
底层的数据结构?
拓展:ViewCacheExtension使用?
- 广告卡片
- 每一页一共有4哥广告
- 这些广告短期内不会发生变化
- 每次滑入一个广告卡片,一般情况下都需要重新绑定
- Cache只关心position,不关心view type
- RecycledViewPool 只关心view type,都需要重新绑定
- 在ViewCacheExtension 里保持4个广告Card缓存
注意:列表中item/广告 的impression统计:
- ListView 通过
getView()
统计,该方法被调用就相当于item view曝光; - RecyclerView 通过
onBindViewHolder()
方法统计?数据有误!经过上述缓存讲解,在第二层Cache时,item重新曝光,在Cache中找到并复用item,此方法并不会被调用,因此数据会有些许不精准。- 可通过
onViewAttachedToWindow()
统计;
- 可通过
RecyclerView 性能优化策略
1. 在onBindViewHolder里设置点击监听?
OnClickListener对象多次被创建,观察者模式
在onCreateViewHolder
里设置点击监听,View、ViewHolder、View.OnClickListener三者一一对应!
2. LinerLayoutManager.setInitialPrefetchItemCount()
- 用户滑动到横向滑动的item RecyclerView的时候,由于需要创建更复杂的RV以及多个子View,可能会导致页面卡顿;
- 由于RenderThread的存在,RV会进行prefetch
LinerLayoutManager.setInitialPrefetchItemCount()
横向列表初次显示时可见的item个数- 只有LinerLayoutManager才有这个API
- 只有嵌套在内部的RV才会生效,在外部的RV调用此方法是无效的
3. RecyclerView.setHasFixedSize()
//伪代码解释
void onContentsChanged()
if(mHasFiedSize)
layoutChildren();
else
requestLayout();
如果Adapter的数据变化(例如item增加、删除)不会导致RV的大小变化,那么可以为RV设置此属性;这样当RV内部的item变化时,可简化重走整个绘制过程。
4. 多个RecyclerView公用RecycledViewPool
重合的viewtype,即可走第四层缓存复用item
使用方法
RecyclerView.RecycledViewPool recycledViewPool =
new RecyclerView.RecycledViewPool();
rv1.setRecycledViewPool(recycledViewPool);
rv2.setRecycledViewPool(recycledViewPool);
rv3.setRecycledViewPool(recycledViewPool);
DiffUtil
1. 介绍
- DiffUtil is a utility class that can calculate the difference between two lists and output a list of update operations that converts the first list into the second one.
- 计算两个不同列表的差异;
- 输出一系列更新操作:第一个列表转换成第二个列表;
- 局部更新方法 notifyItemXXX() 不适用于所有情况。
notifyDataSetChange()
会导致整个布局重新绘制,所有ViewHolder被重新绑定,而且会失去可能的动画效果。- DiffUtil 适用于整个页面需要刷新,但是有部分数据可能相同的情况。
内部算法 Myers Diff Algorith 是动态规划,不要求掌握其具体实现,给出的链接是对该算法的可视化讲解,感兴趣的朋友可以深入研究下:Myers Diff Algorithm - Code & Interactive Visualization
2.原理
那具体怎么运用DiffUtil到实际操作中,首先来介绍一个 重点抽象类DiffUtil.Callback,实现Callback里的方法告诉系统如何计算:
//DiffUtil.class
public abstract static class Callback
public abstract int getOldListSize();
public abstract int getNewListSize();
public abstract boolean areItemsTheSame(int oldItemPosition, int newItemPosition);
public abstract boolean areContentsTheSame(int oldItemPosition, int newItemPosition);
@Nullable
public Object getChangePayload(int oldItemPosition, int newItemPosition)
return null;
- getOldListSize() :返回旧数据集的 size。
- getNewListSize() :返回新数据集的 size。
- areItemsTheSame(int oldItemPosition, int newItemPosition) :比较两个位置的对象是否是同一个item。注意这里指的是逻辑(业务)上判断,而并非内存地址。
- 举个例子,比较两个人是否相同,可以通过身份证ID作为唯一标识。
- areContentsTheSame(int oldItemPosition, int newItemPosition) :比较两个 item 的数据内容是相同。注意该方法被调用的前提:只有当
areItemsTheSame()
返回true时会调用。- 举个例子,还是两个人之间的比较,只有当这2个人的身份证ID都相同,也就是
areItemsTheSame()
返回true时此方法才会被调用,这个时候再来做这2个人具体信息比较,例如姓名、性别、出身地等等。
- 举个例子,还是两个人之间的比较,只有当这2个人的身份证ID都相同,也就是
- getChangePayload(int oldItemPosition, int newItemPosition) : 【不是抽象方法】返回这个 item 更新相关的信息。注意该方法被调用的前提:当
areItemsTheSame()
返回 true ,并且areContentsTheSame()
返回 false 时被调用。- 在上个例子的基础上,这两个人身份证ID相同,比较信息内容时有不同点,则此方法会被调用,并且返回需要更新的信息,例如名字的纠正。
以上几个方法的调用前提、顺序通过下图总结归纳:
3.实践
上代码,实现一个简单的UserDiffCallback例子,来比较两个用户列表:
public class UserDiffCallback extends DiffUtil.Callback
private List<User> oldList;
private List<User> newList;
public UserDiffCallback(List<User> oldList, List<User> newList)
this.oldList = oldList;
this.newList = newList;
@Override
public int getOldListSize() return oldList.size();
@Override
public int getNewListSize() return newList.size();
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition)
//唯一标识符比较
return oldList.get(oldItemPosition).id == newList.get(newItemPosition).id;
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition)
final User oldUser = oldList.get(oldItemPosition);
final User newUser = newList.get(oldItemPosition);
//内容比较
//优化:可以在User类中实现equals方法,根据Model自身特性实现比较“相等”逻辑判断
return oldUser.id == newUser.id &&
oldUser.name.equals(newUser.name) &&
oldUser.sex.equals(newUser.sex) &&
oldUser.address.equals(newUser.address);
上述UserDiffCallback类继承于DiffUtil.Callback抽象类,并实现了其中4个抽象方法,其中areItemsTheSame()
、areContentsTheSame()
实现不同层度的item比较逻辑。此例子简单易懂,无需多余赘述,值得注意的是上述例子并未实现getChangePayload()
方法。
如果没有实现此方法,那么就享受不到“增量更新”的便利,例如User类中可能只有名字name字段修改了,其余的数据都未变化,由于此方法没有被实现,因此整个item还是会被重新刷新。也就是“增量更新”和“全量更新”的区别。
如下代码,我们来实现getChangePayload()
方法,其内部主要逻辑看似与内容比较方法areContentsTheSame()
相似,但还有一点不同是:将两个对象的差异部分存储到Bundle中返回。
public class UserDiffCallback extends DiffUtil.Callback
......
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition)
final User oldUser = oldList.get(oldItemPosition);
final User newUser = newList.get(oldItemPosition);
final Bundle payload = new Bundle();
if(oldUser.id != newUser.id)
payload.putInt(User.KEY_ID, newUser.id);
if(oldUser.sex != newUser.sex)
payload.putString(User.KEY_SEX, newUser.sex);
if(oldUser.address != newUser.address)
payload.putString(User.KEY_ADDRESS, newUser.address);
if(payload.size() == 0)
return null;
return payload;
......
外界调用
实现了 DiffUtil.Callback 后,我们就可以在自定义Adapter中根据自身逻辑选择使用增量更新来update列表,封装方法如下:
public class ShowcaseAdapter extends RecyclerView.Adapter<ShowcaseAdapter.ViewHolder>
private List<User> userList;
ShowcaseAdapter(List<User> userList)
this.userList = userList;
......
public void swapData(List<User> newList, boolean diff)
if(diff)
DiffUtil.Callback diffUtilCallback;
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
new UserDiffCallback(userList, newList), false);
userList = newList;
//增量更新
diffResult.dispatchUpdatesTo(this);
else
userList = newList;
//全量更新
notifyDataSetChanged();
看以上swapData(List<User> newList, boolean diff)
方法封装设计:
- 第一个参数newList,故名思义则是新列表;
- 第二个参数diff 指定是否使用**“增量更新”的方式更新数据,若不需要则直接将新数据替代旧数据列表,进行“全量更新”**;
那么,来看**“增量更新”**的具体操作,此时就使用到了之前封装的 “计算两个列表差异”的工具类UserDiffCallback:
- 调用官方API
DiffUtil.calculateDiff()
方法,即计算需要进行更新操作的列表,而此方法返回的结果则是:旧列表转换成新列表需要更新的部分。- 第一个参数传入自定义工具类UserDiffCallback(待计算的2个列表);
- 第二个参数比较特殊,涉及到列表特征和算法内部计算:如果此RV的 新旧列表的约束条件、位置相同,则传入false,这样内部计算时会取消掉item移动的检测,这种检测会花费O(n^2)时间,n代表item移动、添加、删除的数量。
- 新列表还是赋值到旧列表;
- 获取到 DiffUtil 计算出的列表需要更新结果diffResult后,调用diffResult的
dispatchUpdatesTo()
方法,即所谓的“增量更新”,将列表更换的差异分发给Adapter,使其根据接收到的差异数据做更新。(而并非“全量更新”中的所有item刷新)
总结
getChangePayload()
返回的差异数据 DiffResult,DiffResult 再分发给 notifyItemRangeChanged(position, count, payload)
方法,最终交给 Adapter 的 onBindViewHolder(… List< Object > payloads)
处理。
4. 异步计算Diff
DiffUtil 一般通过这四个方法通知 Adapter 来更新数据。
-
notifyItemChanged()
-
notifyItemMoved()
-
notifyItemRangeChanged()
-
notifyItemRangeInserted()
-
notifyItemRangeRemoved()
DiffUtil 的效率?
上述例子调用calculate
计算方法是在主线程
Android系统每次刷新频率是 1帧/16.6ms,若计算时间过长反而会导致掉帧现象,本想是RV的优化?却…
因此在列表数据比较大的时候,异步计算Diff。 说到异步,这事儿就好办了,以下三个方法推荐:
- 使用 Thread/Handler 将 DiffResult 发送到主线程;
- 使用 RxJava/courtinous 将 calculateDiff 操作放到后台线程;
- 使用Google 提供的 AsyncListDiffer(Executor) / ListAdapter
前两种方式不必多少,来看下第三种官方推荐,可查看:
- https://developer.android.com/reference/android/support/v7/recyclerview/extensions/AsyncListDiffer
- https://developer.android.com/reference/android/support/v7/recyclerview/extensions/ListAdapter
以上是关于谁有奇闻怪事未解之迷的资料的主要内容,如果未能解决你的问题,请参考以下文章
走进RecyclerView未解之迷 ------ 原理和优化