Android爬坑之旅之WebView

不知不觉,Hybird App已经成了目前比较主流的一种开发方式。

对于用户体验要求较高或者与硬件交互较多的功能我们一般都会采用Native原生的方式来实现。 而用户交互少,偏展示类,活动类的功能我们则通常采用H5的方式来实现, 例如新闻类的app,详情展示页一般就是H5的页面

  • 一方面图文排版上web有着先天的优势,同时纯展示类的页面在目前的移动设备上,性能体验已经很难让用户分辨是网页还是原生了;
  • 另一方面,H5的页面跨平台,方便在原生客户端上实现分享功能,拥有较强的传播性,我们平时常见的活动页面也拥有这样的优势,所以你看到的活动页面也基本都是H5,只需轻轻一点就能分享到各个平台;
  • 同时,H5的页面开发降低了开发成本,一套代码,web,android,ios都能访问。(然而实际开发过程中,H5的适配也都是各种泪)

既然Hybird App有这么多优势,那在Android中我们通过什么样的方式在原生项目中嵌入H5页面呢?

那就不得不提到我们的WebVew了,作为官方唯一用来显示web的组件, 展示网页这样的任务也只能交给它了。

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

引用官方文档的一句话: WebView是一个用来在Activity中显示我们网页的视图组件,它通过webkit渲染引擎渲染和显示我们的web页面,并且包含了web的历史导航操法,页面放大缩小,文本搜索等方法。

我们首先来看一下WebView的基本用法:

#WebView的基本用法


关于WebView的基本用法,大部分人也是轻车熟路, 本来也是写了一部分,无意中发现有位博主的博客对WebView的介绍实在太过详细,像我这样的懒人,有更好的文章是不会自己去写的, 所以删了自己写的,将大牛博主的博客分享出来,感兴趣同学的可以一起看一看:

Android WebView 开发详解(一)  Android WebView 开发详解(二) Android WebView 开发详解(三)

了解完WebView的基本用法,那就来总结下最近项目中遇到的关于WebView的坑

#项目中使用WebView遇到的问题


###WebView界面的原生标题设置

如图所示, 一般情况下,我们WebView所在界面由顶部带标题的原生导航栏WebView的内容部分组成, 而WebView中的界面可能在点击后还会再跳其他Web页面(如图点击请假会在当前WebView跳转请假的Web页面)。

由于点击内容的不确定性,所以通常情况下,最简单的做法就是捕获h5页面的 标签来进行标题设置。

对于捕获 </a> 标签内容的方式,WebView也很好地提供了支持,我们可以通过继承WebChromeClient的onReceivedTitle来进行获取:</p> <pre><code lang="bash" class="hljs bash"> private class WebViewChromeClient extends WebChromeClient { @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); mTitleText.setTitle(String.valueOf(view.getTitle())); } } </code></pre><p>然而这样的方式在实际使用中有一个问题:</p> <p>当通过 <a href="https://developer.android.google.cn/reference/android/webkit/WebView.html#goBack()" target="_blank">webView.goBack()</a> 方式返回上一级Web页面的时候不会触发这个方法,因此会导致标题无法跟随历史记录返回上一级页面。</p> <p>所以在项目中, 我们可以通过重写 <a href="https://developer.android.google.cn/reference/android/webkit/WebViewClient.html" target="_blank">WebViewClient</a> 的 [onPageFinished](https://developer.android.google.cn/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String)) 方法,在 [onPageFinished](https://developer.android.google.cn/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String)) 中对界面标题进行设置。 因为不管是历史记录的返回还是点击跳转都会触发页面加载, 当页面加载完成时(不包括js动态创建以及img图片加载完毕)都会触发 [onPageFinished](https://developer.android.google.cn/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String)) 这个方法, 此时我们去获取 <a href="" target="_blank"><title></a> 的标题内容不会有任何问题,可以确保在页面返回时能够获取到正确的标题。</p> <pre><code lang="bash" class="hljs bash"> mWebView.setWebViewClient(new <span class="hljs-function"><span class="hljs-title">WebViewClient</span></span>(){ //Web页面每次加载并完成时会触发该方法 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mToolbar.setTitle(String.valueOf(view.getTitle())); Log.i (LOG_TAG, <span class="hljs-string">"onPageFinished"</span>); } }); </code></pre><p><strong>注: 这种做法有一个缺陷,就是返回上一个界面的时候,等页面加载完成的时候标题才会显示出来,为了更好地优化,我们可以创建一个集合用来保存我们的标题,加载url的时候把标题添加进集合,当返回上一级页面的时候,从集合中取出标题进行显示,同时从集合中移除标题。</strong></p> <hr> <p>###WebView中的Web页面存在<input type='file'>标签时无法打开文件选择器</p> <p>在我们的手机浏览器中,当web页面中有 <a href="" target="_blank"><input type='file'></a> 按钮标签的时候点击会自动打开系统的文件选择器, 然而这个功能在主流系统的WebView中没有被默认实现, 因此,为了让 <a href="" target="_blank"><input type='file'></a> 点击时能够打开系统的文件选择器, 我们必须通过重写 <a href="https://developer.android.google.cn/reference/android/webkit/WebChromeClient.html" target="_blank">WebChromeClient</a> 来实现点击<a href="" target="_blank"><input type='file'></a> 打开系统文件选择器。 代码如下:</p> <pre><code lang="bash" class="hljs bash">public class MainActivity extends AppCompatActivity { /** Android 5.0以下版本的文件选择回调 */ protected ValueCallback<Uri> mFileUploadCallbackFirst; /** Android 5.0及以上版本的文件选择回调 */ protected ValueCallback<Uri[]> mFileUploadCallbackSecond; protected static final int REQUEST_CODE_FILE_PICKER = 51426; protected String mUploadableFileTypes = <span class="hljs-string">"image/*"</span>; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); <span class="hljs-built_in">set</span>ContentView(R.layout.activity_main); initWebView(); } private void <span class="hljs-function"><span class="hljs-title">initWebView</span></span>() { mWebView = (WebView) findViewById(R.id.my_webview); mWebView.loadUrl(<span class="hljs-string">"file:///android_asset/index.html"</span>); mWebView.setWebChromeClient(new OpenFileChromeClient()); } private class OpenFileChromeClient extends WebChromeClient { // Android 2.2 (API level 8)到Android 2.3 (API level 10)版本选择文件时会触发该隐藏方法 @SuppressWarnings(<span class="hljs-string">"unused"</span>) public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser(uploadMsg, null); } // Android 3.0 (API level 11)到 Android 4.0 (API level 15))版本选择文件时会触发,该方法为隐藏方法 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { openFileChooser(uploadMsg, acceptType, null); } // Android 4.1 (API level 16) -- Android 4.3 (API level 18)版本选择文件时会触发,该方法为隐藏方法 @SuppressWarnings(<span class="hljs-string">"unused"</span>) public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileInput(uploadMsg, null, <span class="hljs-literal">false</span>); } // Android 5.0 (API level 21)以上版本会触发该方法,该方法为公开方法 @SuppressWarnings(<span class="hljs-string">"all"</span>) public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { <span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= 21) { final boolean allowMultiple = fileChooserParams.getMode() == FileChooserParams.MODE_OPEN_MULTIPLE;//是否支持多选 openFileInput(null, filePathCallback, allowMultiple); <span class="hljs-built_in">return</span> <span class="hljs-literal">true</span>; } <span class="hljs-keyword">else</span> { <span class="hljs-built_in">return</span> <span class="hljs-literal">false</span>; } } } @SuppressLint(<span class="hljs-string">"NewApi"</span>) protected void openFileInput(final ValueCallback<Uri> fileUploadCallbackFirst, final ValueCallback<Uri[]> fileUploadCallbackSecond, final boolean allowMultiple) { //Android 5.0以下版本 <span class="hljs-keyword">if</span> (mFileUploadCallbackFirst != null) { mFileUploadCallbackFirst.onReceiveValue(null); } mFileUploadCallbackFirst = fileUploadCallbackFirst; //Android 5.0及以上版本 <span class="hljs-keyword">if</span> (mFileUploadCallbackSecond != null) { mFileUploadCallbackSecond.onReceiveValue(null); } mFileUploadCallbackSecond = fileUploadCallbackSecond; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); <span class="hljs-keyword">if</span> (allowMultiple) { <span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= 18) { i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, <span class="hljs-literal">true</span>); } } i.setType(mUploadableFileTypes); startActivityForResult(Intent.createChooser(i, <span class="hljs-string">"选择文件"</span>), REQUEST_CODE_FILE_PICKER); } public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { <span class="hljs-keyword">if</span> (requestCode == REQUEST_CODE_FILE_PICKER) { <span class="hljs-keyword">if</span> (resultCode == Activity.RESULT_OK) { <span class="hljs-keyword">if</span> (intent != null) { //Android 5.0以下版本 <span class="hljs-keyword">if</span> (mFileUploadCallbackFirst != null) { mFileUploadCallbackFirst.onReceiveValue(intent.getData()); mFileUploadCallbackFirst = null; } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (mFileUploadCallbackSecond != null) {//Android 5.0及以上版本 Uri[] dataUris = null; try { <span class="hljs-keyword">if</span> (intent.getDataString() != null) { dataUris = new Uri[] { Uri.parse(intent.getDataString()) }; } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= 16) { <span class="hljs-keyword">if</span> (intent.getClipData() != null) { final int numSelectedFiles = intent.getClipData().getItemCount(); dataUris = new Uri[numSelectedFiles]; <span class="hljs-keyword">for</span> (int i = 0; i < numSelectedFiles; i++) { dataUris[i] = intent.getClipData().getItemAt(i).getUri(); } } } } } catch (Exception ignored) { } mFileUploadCallbackSecond.onReceiveValue(dataUris); mFileUploadCallbackSecond = null; } } } <span class="hljs-keyword">else</span> { //这里mFileUploadCallbackFirst跟mFileUploadCallbackSecond在不同系统版本下分别持有了 //WebView对象,在用户取消文件选择器的情况下,需给onReceiveValue传null返回值 //否则WebView在未收到返回值的情况下,无法进行任何操作,文件选择器会失效 <span class="hljs-keyword">if</span> (mFileUploadCallbackFirst != null) { mFileUploadCallbackFirst.onReceiveValue(null); mFileUploadCallbackFirst = null; } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (mFileUploadCallbackSecond != null) { mFileUploadCallbackSecond.onReceiveValue(null); mFileUploadCallbackSecond = null; } } } } } </code></pre><p><strong>注:当用户点击input file弹出文件选择器后,点击取消或者返回按钮没有执行选择时,必须在onActivityResult里给valueCallback的onReceiveValue传null,因为valueCallback持有的是WebView,在onReceiveValue没有回传值的情况下,WebView无法进行下一步操作,会导致取消选择文件后,点击input file不会再响应:</strong></p> <pre><code lang="bash" class="hljs bash"> <span class="hljs-keyword">if</span> (mFileUploadCallbackFirst != null) { mFileUploadCallbackFirst.onReceiveValue(null); mFileUploadCallbackFirst = null; } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (mFileUploadCallbackSecond != null) { mFileUploadCallbackSecond.onReceiveValue(null); mFileUploadCallbackSecond = null; } </code></pre><p>示例demo地址: https://github.com/cjpx00008/FileChooser4WebViewDemo</p> <hr> <p>###WebView中的web页面调用系统选择器或者相机导致app进入后台被系统释放</p> <p>众所周知,WebView基于webkit内核来渲染web页面,因此使用起来相当于一个小型浏览器,即使页面内容不复杂,只要使用WebView也会占用大量的内存。</p> <p>而Android的内存回收机制,在系统内存不足的情况下会优先释放内存占用较大的app从而回收内存资源,此时正在使用WebView的运行在后台的app肯定是首当其冲被回收的。</p> <p>因此,当WebView通过input file调用系统文件选择器,或者通过文件选择器调用了相机时,我们的app就进入了后台,在部分低端Android设备(尤其红米这类手机,默认的神隐模式会在app进入后台的时候较大概率的释放app)或者系统内存资源不足的情况下,我们的app就会优先被释放掉,导致文件选择完毕后,回到上一界面时,app的界面重新走了onCreate,web页面也因此重建了。</p> <p>对于部分需要填写大量表单的web页面来说,用户填写的数据会随着界面的销毁重建而丢失,而选择的文件也因为页面的重建而无法回传给input file,这对于用户的体验来说肯定是不友好的。</p> <p>也许你会说,重写onSaveInstance保存数据就是啦。 这也是我一开始考虑的, 我们的WebView也提供了 <a href="https://developer.android.google.cn/reference/android/webkit/WebView.html#saveState(android.os.Bundle)" target="_blank">saveState</a> 以及 <a href="https://developer.android.google.cn/reference/android/webkit/WebView.html#restoreState(android.os.Bundle)" target="_blank">restoreState</a> 来保存状态。</p> <p>然而悲催的是,这两个方法并不会保存web页面内的数据,它只保存了WebView加载的页面,前进后退的历史状态等数据。</p> <p>引用官方文档的描述:</p> <blockquote> <p>Saves the state of this WebView used in <a href="https://developer.android.google.cn/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)" target="_blank">onSaveInstanceState(Bundle)</a> . Please note that this method no longer stores the display data for this WebView. The previous behavior could potentially leak files if <a href="https://developer.android.google.cn/reference/android/webkit/WebView.html#restoreState(android.os.Bundle)" target="_blank">restoreState(Bundle)</a>  was never called.</p> </blockquote> <p><strong>Please note that this method no longer stores the display data for this WebView</strong></p> <p>WebView的saveState并不会保存界面的数据。</p> <p>所以,对于表单数据的恢复,我们只能自己想办法了,我们这里采用了两套方案:</p> <ol> <li>通过WebView与JS交互,在onSaveInstance的时候触发界面保存数据,保存数据的方式也大体分为两种, 一种使用H5自带的localStorage来进行数据存储,页面销毁重建的时候H5页面判断本地localStorage数据是否有值,有就将值重新填充到页面表单,提交数据后清除本地localStorage的数据。 这种方式需要给WebView开启对localStorage的支持。</li> </ol> <pre><code lang="bash" class="hljs bash">WebSettings settings = mWebView.getSettings(); settings.setDomStorageEnabled(<span class="hljs-literal">true</span>); </code></pre><p>另一种则提供JS接口将数据传递给原生,通过原生代码将数据保存到本地,在页面重建渲染完成时,web页面通过JS接口调用原生方法拉取数据判断是否有值,有则填充表单,无则不做操作,提交数据后调用JS接口调用原生方法清空本地数据。</p> <ol start="2"> <li>由web端自己处理,在表单页面文本输入失去焦点时自动保存数据,页面销毁重建时,自己拉取数据进行判断。 这种方式对原生的依赖较低,个人更倾向这种方式,当然最终由于项目的特殊情况,我们还是采用了第一种方式。</li> </ol> <p>以上是表单数据的恢复方案,</p> <p>而对于从系统文件选择器选择的文件web页面是无法直接接收并处理了,这里我们提供了一个JS接口在web页面加载完成时,进行触发,并将数据传递给web页面。</p> <p>说到这里,不得不提另外一个问题</p> <hr> <p>###WebView调用服务端页面如何访问本地文件</p> <p>上面我们提到了通过JS接口将选择的文件数据传递给web页面,</p> <p>然而由于安全原因,WebView限制了远程url页面访问本地文件, 如果我们加载的url是服务端的页面,那我们没有任何办法直接通过文件地址来访问客户端本地的文件</p> <p>我们知道,WebView用来加载网页的方式主要有三种:</p> <pre><code lang="bash" class="hljs bash">loadUrl(String url) loadUrl(String url, Map<String, String> additionalHttpHeaders) </code></pre><pre><code lang="bash" class="hljs bash">loadData(String data, String mimeType, String encoding) </code></pre><pre><code lang="bash" class="hljs bash">loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String <span class="hljs-built_in">history</span>Url) </code></pre><p>[loadData()](https://developer.android.google.cn/reference/android/webkit/WebView.html#loadData(java.lang.String, java.lang.String, java.lang.String)) 和 [loadDataWithBaseURL()](https://developer.android.google.cn/reference/android/webkit/WebView.html#loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)) 都是直接将数据加载进WebView中,相当于显示的一个本地Web</p> <p>loadUrl也可以通过访问本地的文件地址(例如本地asset目录下的存放了index.html页面,可以通过<code>loadUrl("file:///android_asset/index.html")</code>来显示web页面)</p> <p>对于这样的三种加载本地内容的方式,我们可以使用多种方式来传递路径供web页面传递,这里以图片为例(相册目录下test/IMG_20170105_093405.jpg):</p> <ol> <li>直接通过文件的绝对地址来提供给页面显示:</li> </ol> <pre><code lang="bash" class="hljs bash"><img src = <span class="hljs-string">'file:///storage/emulated/0/dcim/test/IMG_20170105_093405.jpg'</span> /> </code></pre><ol start="2"> <li>通过媒体库查询出来的content uri地址展示</li> </ol> <pre><code lang="bash" class="hljs bash"><img src = <span class="hljs-string">'content://media/external/images/media/102610'</span> /> </code></pre><ol start="3"> <li>通过FileProvider转换的content uri地址展示</li> </ol> <pre><code lang="bash" class="hljs bash"><img src = <span class="hljs-string">'content://com.test.myfileprovider/dcim/test/IMG_20170105_093405.jpg'</span>/> </code></pre><p>可当你使用loadUrl(String url)加载服务端的http地址时,以上三种方法将均无法使用,经过各种尝试,目前找到两种方案来提供给web端进行图片显示:</p> <ol> <li> <p>由原生代码处理,将文件流转换为Base64之后通过JS接口回传给web;</p> </li> <li> <p>重写WebViewClient里的shouldInterceptRequest方法,每当页面发生资源请求的时候就会触发这个方法,我们可以过滤请求,判断请求是否为本地文件,通过拦截请求转换为二进制流回传回去, 示例代码如下:</p> </li> </ol> <pre><code lang="bash" class="hljs bash">mWebView.setWebViewClient(new <span class="hljs-function"><span class="hljs-title">WebViewClient</span></span>(){ @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { <span class="hljs-keyword">if</span> (url.startsWith(<span class="hljs-string">"http://"</span>)&&url.endWith(<span class="hljs-string">".jpg"</span>) { <span class="hljs-built_in">return</span> getWebResourceResponse(<span class="hljs-string">"/storage/emulated/0/dcim/trinaic/IMG_20170105_093405.jpg"</span>, <span class="hljs-string">"image/jpeg"</span>, <span class="hljs-string">".jpg"</span>); } <span class="hljs-built_in">return</span> super.shouldInterceptRequest(view, url); } } private WebResourceResponse getWebResourceResponse(String url, String mime, String style) { WebResourceResponse response = null; try { response = new WebResourceResponse(mime, <span class="hljs-string">"UTF-8"</span>, new FileInputStream(new File(url))); } catch (FileNotFoundException e) { e.printStackTrace(); } <span class="hljs-built_in">return</span> response; } </code></pre><hr> <p>###WebView JS注入漏洞</p> <p>要想让原生跟JS进行交互,按照官方提供的方法就得使用addJavaScriptInterface</p> <pre><code lang="bash" class="hljs bash">class JsObject { @JavascriptInterface public String <span class="hljs-function"><span class="hljs-title">toString</span></span>() { <span class="hljs-built_in">return</span> <span class="hljs-string">"injectedObject"</span>; } } webView.addJavascriptInterface(new JsObject(), <span class="hljs-string">"injectedObject"</span>); webView.loadData(<span class="hljs-string">""</span>, <span class="hljs-string">"text/html"</span>, null); webView.loadUrl(<span class="hljs-string">"javascript:alert(injectedObject.toString())"</span>); </code></pre><blockquote> <p>Injects the supplied Java object into this WebView. The object is injected into the JavaScript context of the main frame, using the supplied name. This allows the Java object's methods to be accessed from JavaScript. For applications targeted to API level <a href="https://developer.android.google.cn/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN_MR1" target="_blank">JELLY_BEAN_MR1</a>  and above, only public methods that are annotated with <a href="https://developer.android.google.cn/reference/android/webkit/JavascriptInterface.html" target="_blank">JavascriptInterface</a>  can be accessed from JavaScript. For applications targeted to API level <a href="https://developer.android.google.cn/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN" target="_blank">JELLY_BEAN</a>  or below, all public methods (including the inherited ones) can be accessed, see the important security note below for implications.</p> </blockquote> <p>引用官方api的说明,在Android 4.2以下,会有被注入的风险,4.2以上版本可以通过<code>@JavascriptInterface</code>的注解来处理这个问题。 具体的注入方式,我找了篇博客,如果有不清楚的同学可以了解下: <a href="http://blog.csdn.net/leehong2005/article/details/11808557/" target="_blank">Android WebView的Js对象注入漏洞解决方案</a></p> <p>在之前乌云平台报出的漏洞中, android/webkit/webview中默认内置的一个searchBoxJavaBridge_ 接口同时存在远程代码执行漏洞</p> <p>在于android/webkit/AccessibilityInjector.java中,调用了此组件的应用在开启辅助功能选项中第三方服务的安卓系统中会造成远程代码执行漏洞。这两个接口分别是"accessibility" 和"accessibilityTraversal" ,此漏洞原理与searchBoxJavaBridge_接口远程代码执行相似,均为未移除不安全的默认接口,不过此漏洞需要用户启动系统设置中的第三方辅助服务,利用条件较复杂。</p> <p>因此,一般情况下我们通过removeJavaScripteInterface来移除这几个接口</p> <pre><code lang="bash" class="hljs bash"> <span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT < 17) { mAdvanceWebView.removeJavascriptInterface(<span class="hljs-string">"searchBoxJavaBridge_"</span>); mAdvanceWebView.removeJavascriptInterface(<span class="hljs-string">"accessibility"</span>); mAdvanceWebView.removeJavascriptInterface(<span class="hljs-string">"accessibilityTraversal"</span>); } </code></pre><p>除此之外也有通过onJsPrompt的方式来实现WebView原生跟JS交互功能的,github上的开源项目JSBridge就是采用这种方法: https://github.com/lzyzsd/JsBridge</p> <p>之前拜读过大名鼎鼎的cordova的源码,它内部的原生JS交互也是采用onJsPrompt的方式,不过在此基础上做了更强大的封装。</p> <hr> <p>###WebView后台耗电问题</p> <p>当我们的WebView的web页面在解析或者播放视频再或者有js定时器在执行的时, 如果我们把应用退到后台,不做任何处理的情况下,以上的操作还会在后台继续执行,导致WebView在后台持续耗电,因此一般我们会做以下处理</p> <pre><code lang="bash" class="hljs bash"> @Override protected void <span class="hljs-function"><span class="hljs-title">onPause</span></span>() { super.onPause(); mWebView.onPause();//暂停部分可安全处理的操作,如动画,定位,视频播放等 mWebView.pauseTimers();//暂停所有WebView的页面布局、解析以及JavaScript的定时器操作 } @Override protected void <span class="hljs-function"><span class="hljs-title">onResume</span></span>() { super.onResume(); mWebView.onResume(); mWebView.resumeTimers(); } </code></pre><hr> <p>对于WebView的使用,在处理问题的过程中发现一个不错的开源库: https://github.com/delight-im/Android-AdvancedWebView</p> <p>基本上上面我提到的或者没提到的问题它都做了一定的封装处理,并且考虑了一些版本适配的问题,可以直接拿来使用,也可以拿来参考学习。</p> <p>如果你觉得问题还是太多的话也可以考虑使用<a href="http://x5.tencent.com/" target="_blank">腾讯浏览服务</a>,基于QQ浏览器X5内核,适配了Android全部主流平台,可以在所有Android手机上使用Blink的技术能力,具有更好的H5/CSS3支持和性能,目前微信、qq都在使用它。</p> <p>唯一的缺陷就是它不提供打包内核版的SDK,第一次使用时,它会自动到腾讯服务端去下载内核,下载完毕后会弹窗提示用户是否重启app,重启之后就能正常使用x5浏览服务了,如果你不介意这样的用户体验,可以考虑直接使用腾讯浏览服务。</p> <hr> <p>(补充) ###WebView混淆问题</p> <p>如果app打包混淆之后发现提供给web页面的JS接口失效了,记得检查是否添加了JavaScriptInterface的混淆配置:</p> <pre><code lang="bash" class="hljs bash">-keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } </code></pre><p>###红米WebView内部Web页面的div自身滚动条问题 红米上WebView内部的Web页面的div由于内容高度大于div,产生了基于div的滚动条(WebView滚动条已禁用的情况下),通过设置div的css样式来禁用div滚动条</p> <pre><code lang="bash" class="hljs bash">Html dom元素ID或class:: -webkit-scrollbar {display:none} </code></pre><p>###WebView内部web页面px跟dp的关系 经测试发现,WebView内部web页面的px值会在内部自动转换为dp,且1px=1dp,跟ppi值无关,这点跟原生开发中的1dp = 设备ppi/160 * px换算关系nveou</p> </p> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1290061306619043840"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Android爬坑之旅之WebView)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1891226686683410432.htm" title="android listpreference 自定义,android – 自定义布局ListPreference" target="_blank">android listpreference 自定义,android – 自定义布局ListPreference</a> <span class="text-muted">呼呼啦啦就瘸了</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/listpreference/1.htm">listpreference</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89/1.htm">自定义</a> <div>在您的preference.xml文件中,您可以通过类的全名来引用自定义ListPreference,即com.example.MyPreferenceandroid:key="pref_wifi_key"android:title="@string/settings">android:key="pref_wifi_remove"android:title="@string/remove_wifi</div> </li> <li><a href="/article/1891224416122105856.htm" title="Android Preference隐藏,删除方式" target="_blank">Android Preference隐藏,删除方式</a> <span class="text-muted">码点</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/framwork/1.htm">framwork</a><a class="tag" taget="_blank" href="/search/Android%E5%BA%95%E5%B1%82%E7%9F%A5%E8%AF%86/1.htm">Android底层知识</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>在Android系统开发中,经常需要去掉或者隐藏原生设置的一些条目。一、隐藏Preference方法@VisibleForTestingstaticfinalStringENABLE="enable";Preferenceenable=findPreference(ENABLE);enable.setVisible(false);R.xml.main&l</div> </li> <li><a href="/article/1891223786397691904.htm" title="git之reset命令" target="_blank">git之reset命令</a> <span class="text-muted">crayon-shin-chan</span> <a class="tag" taget="_blank" href="/search/surprise/1.htm">surprise</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/1.htm">版本控制</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a> <div>1.简介git-reset:将当前的HEAD重置为指定状态,也就是重置顶部commit的引用2.概要gitreset[-q][][--]…​gitreset[-q][--pathspec-from-file=[--pathspec-file-nul]][]gitreset(--patch|-p)[][--][…​]gitreset[--soft|--mixed[-N]|--hard|--merge</div> </li> <li><a href="/article/1891219117877293056.htm" title="SpringCloud之网关Gateway" target="_blank">SpringCloud之网关Gateway</a> <span class="text-muted">2401_85358655</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/gateway/1.htm">gateway</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>3、过滤器(Filter):一个标准的SpringWebFilter,SpringCloudGateway中的Filter分为两种类型:GatewayFilter和GlobalFilter。过滤器Filter可以对请求和响应进行处理2、基本搭建①、新建模块②、导入依赖4.0.0com.gatewaycode0.0.1-SNAPSHOTgatewayDemoprojectforSpringBoot8</div> </li> <li><a href="/article/1891215967539752960.htm" title="qt UI架构之MVD" target="_blank">qt UI架构之MVD</a> <span class="text-muted">yaofei2006</span> <a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>在Qt中,MVD(Model-View-Delegate)是一种用于分离数据、显示和用户交互的设计架构。它是MVC(Model-View-Controller)的变体,特别适合用于处理复杂的数据显示和编辑场景(如表格、列表、树形结构等)。1.MVD架构的核心组件MVD架构由以下三个核心组件组成:1.1Model(模型)负责管理数据。提供数据的访问接口(如data()和setData())。通知视图</div> </li> <li><a href="/article/1891182427477438464.htm" title="咱们一起学C++ 第一百八十八篇:之C++中全局new和delete运算符的重载探秘" target="_blank">咱们一起学C++ 第一百八十八篇:之C++中全局new和delete运算符的重载探秘</a> <span class="text-muted">一杯年华@编程空间</span> <a class="tag" taget="_blank" href="/search/%E5%92%B1%E4%BB%AC%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0C%2B%2B/1.htm">咱们一起学习C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>咱们一起学C++第一百八十八篇:之C++中全局new和delete运算符的重载探秘大家好!C++作为一门强大的编程语言,在内存管理方面提供了丰富的机制。今天咱们来深入探讨C++中全局new和delete运算符的重载,希望通过这次学习,我们能对C++的内存管理有更深刻的理解,一起在编程的道路上不断进步!一、为什么要重载全局new和delete运算符在C++编程中,默认的全局new和delete运算符</div> </li> <li><a href="/article/1891149148019814400.htm" title="STM32之SG90舵机控制" target="_blank">STM32之SG90舵机控制</a> <span class="text-muted">如愿小李</span> <a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a> <div>目录前言:一、硬件准备与接线1.1硬件清单1.2接线二、SG90舵机简介1.1外观1.2基本参数1.3引脚说明1.4控制原理1.5特点1.6常见问题三、单片机简介四、程序设计4.1定时器配置4.2角度控制函数4.3主函数调用五、总结前言:STM32F103C8T6是一款性价比极高的ARMCortex-M3内核微控制器,广泛应用于嵌入式开发。SG90舵机则是小型舵机的代表,常用于机器人、智能家居等场</div> </li> <li><a href="/article/1891142591966146560.htm" title="15. k8s二进制集群之CoreDNS部署" target="_blank">15. k8s二进制集群之CoreDNS部署</a> <span class="text-muted">沙漠绿州(IT追随者)</span> <a class="tag" taget="_blank" href="/search/k8s%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%90%AD%E5%BB%BA/1.htm">k8s二进制搭建</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a><a class="tag" taget="_blank" href="/search/dns/1.htm">dns</a> <div>为搭建DNS服务需要准备什么?如何下载CoreDNS服务配置文件创建coredns.yaml配置文件(参考原始配置创建)提前准备好CoreDNS镜像资源【可选】如何启动CoreDNS服务当服务异常,如解决coredns启动失败问题总结当我们搭建完k8s集群之后可以为此部署一个DNS提供内部主机或域名解析能力,这里就说到了CoreDNS在Kubenetes起到的作用了。CoreDNS主要为Pod和服</div> </li> <li><a href="/article/1891140071051030528.htm" title="Android App开发之Jetpack架构,带你全面理解View的绘制流程" target="_blank">Android App开发之Jetpack架构,带你全面理解View的绘制流程</a> <span class="text-muted">m0_66144992</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>在UI组件日益完善的同时,也开始出现了RecyclerView、ConstraintLayout、MotionLayout等一些可以辅助大家写出更加符合性能要求的界面效果。在UI控件日益满足需求的同时,系统的安全与稳定性、用户隐私也越来越被重视,所以每个版本都出现了一些大的适配工作,例如运行时权限,FileProvider适配,限制后台服务、广播,限制反射SDK私有API,引导使用HTTPS,甚至</div> </li> <li><a href="/article/1891138554755608576.htm" title="VTK之vtkLight" target="_blank">VTK之vtkLight</a> <span class="text-muted">浩瀚之水_csdn</span> <a class="tag" taget="_blank" href="/search/%E4%B8%89%E7%BB%B4%E5%9B%BE%E5%83%8F/1.htm">三维图像</a><a class="tag" taget="_blank" href="/search/vtk/1.htm">vtk</a> <div>vtkLight是VTK(TheVisualizationToolkit)中用于代表现实场景中灯光的一个类。在三维渲染场景中,灯光是必备的要素之一,它为场景提供照明,使得渲染出来的图像更加逼真和立体。以下是对vtkLight的详细介绍:一、灯光类型vtkLight可以分为两种类型:位置灯光(PositionalLight,也叫聚光灯)和方向灯光(DirectionLight)。位置灯光:光源位置在</div> </li> <li><a href="/article/1891136538134245376.htm" title="Android AIDL实现进程间通讯IPC" target="_blank">Android AIDL实现进程间通讯IPC</a> <span class="text-muted">2501_90326753</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>以下是一个简单的实现:1.AIDLServer提供数据接口①创建.aidl文件,公开接口给Client:packagecom.example.aidlserver.aidl;interfaceDataService{intgetData(Stringtype);StringgetTime();}②对应的Service,实现aidl中对应的方法:packagecom.example.aidlserv</div> </li> <li><a href="/article/1891133639043903488.htm" title="大数据之-hdfs+hive+hbase+kudu+presto集群(6节点)" target="_blank">大数据之-hdfs+hive+hbase+kudu+presto集群(6节点)</a> <span class="text-muted">管哥的运维私房菜</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/hdfs/1.htm">hdfs</a><a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/kudu/1.htm">kudu</a><a class="tag" taget="_blank" href="/search/presto/1.htm">presto</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>几个主要软件的下载地址:prestohttps://prestosql.io/docs/current/index.htmlkudurpm包地址https://github.com/MartinWeindel/kudu-rpm/releaseshivehttp://mirror.bit.edu.cn/apache/hive/hdfshttp://archive.apache.org/dist/ha</div> </li> <li><a href="/article/1891132631140069376.htm" title="【机器学习】无监督学习算法之:K均值聚类" target="_blank">【机器学习】无监督学习算法之:K均值聚类</a> <span class="text-muted">Carl_奕然</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>K均值聚类1、引言2、K均值聚类2.1定义2.2原理2.3实现方式2.4算法公式2.4.1距离计算公式2.4.1中心点计算公式2.5代码示例3、总结1、引言小屌丝:鱼哥,K均值聚类我不懂,能不能给我讲一讲?小鱼:行,可以小屌丝:额…今天咋直接就答应了?小鱼:不然呢?小屌丝:有啥条件,直接说,小鱼:没有小屌丝:这咋的了,不提条件,我可不踏实小鱼:你看看你,我不提条件,你还不踏实,那你这是非让我提条件</div> </li> <li><a href="/article/1891131368813948928.htm" title="adb连接WiFi调试" target="_blank">adb连接WiFi调试</a> <span class="text-muted">陌恋殇雪</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/wifi/1.htm">wifi</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a> <div>adbWiFi(手机,平板,车机)进行调试确认配置好adb环境adb命令adbtcpip5555连接adbconnet(手机WiFiIP)注意:必须在同一WiFi条件下(手机或者其它也可以连接电脑分享的热点),同时第一次操作的时候需要usb线连接,操作完成后断开就能成功,可以从AndroidStudio中看到存在这个ip的设备下面提供一张操作截图:</div> </li> <li><a href="/article/1891130487045419008.htm" title="正确姿势使用adb wifi调试" target="_blank">正确姿势使用adb wifi调试</a> <span class="text-muted">IT先森</span> <a class="tag" taget="_blank" href="/search/Android%E5%AE%9E%E6%88%98%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/1.htm">Android实战开发指南</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a><a class="tag" taget="_blank" href="/search/wifi%E8%B0%83%E8%AF%95/1.htm">wifi调试</a><a class="tag" taget="_blank" href="/search/adb%E8%B0%83%E8%AF%95/1.htm">adb调试</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a> <div>       正确姿势使用adbwifi调试前言  在Android设备样机调试阶段,我们一般都会使用adbusb进行相关的调试,但是有时候可能usb口调试不是很方便,譬如usb口被占用了或者usb口不够,那么这个时候adbwifi调试就排上用场了,下面详细介绍一下怎么正确使用adbwifi进行调试。前期准备  首先必须保证你的手机和电脑连接的是同一个wifi,这点不用说吧。而且最好是局域网,因为</div> </li> <li><a href="/article/1891127209356226560.htm" title="开始使用 adb WiFi 调试模式" target="_blank">开始使用 adb WiFi 调试模式</a> <span class="text-muted">每天干八碗饭的东东</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>使用adbWiFi调试模式,通过以下几个步骤即可完成(开始这些配置之前先确保你的adb环境是配置好的):确保Android手机和电脑连接的是同一局域网的WiFi;通过USB线连接Android手机;设置手机侦听端口5555上的TCP/IP连接: $adbtcpip5555※注意:如果有多个手机连接在电脑上,需要用-s‘serial_number’参数指定目标手机,比如: $adb-s'04157d</div> </li> <li><a href="/article/1891125193896685568.htm" title="【AI论文】随机鹦鹉在大型语言模型(LLM)之肩:物理概念理解的总结性评估" target="_blank">【AI论文】随机鹦鹉在大型语言模型(LLM)之肩:物理概念理解的总结性评估</a> <span class="text-muted">东临碣石82</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a> <div>摘要:我们以系统的方式探讨了一个被广泛提及的问题:大型语言模型(LLM)真的理解它们所说的话吗?这与人们更为熟悉的术语“随机鹦鹉”息息相关。为此,我们提出了一项总结性评估,针对一项精心设计的物理概念理解任务——PhysiCo。我们的任务通过使用网格格式的输入来抽象描述物理现象,从而缓解了记忆问题。这些网格代表了不同层次的理解,从核心现象、应用实例到网格世界中其他抽象模式的类比。对我们任务的全面研究</div> </li> <li><a href="/article/1891123932723998720.htm" title="通过WiFi连接adb调试" target="_blank">通过WiFi连接adb调试</a> <span class="text-muted">小刘学安卓</span> <a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>通过WiFi连接adb调试解决cannotconnectto192.168.1.136:5555:由于目标计算机积极拒绝,无法连接。(10061)解决办法1(Windows下cmd环境执行)1.连接USB数据线,打开USB调试使用windows的“运行”命令行方式:(此方法需配置adb环境变量,也可直接进入adb工具目录执行\android-sdk-windows\platform-tools\)</div> </li> <li><a href="/article/1891123931222437888.htm" title="性能调优专题(11)之JVM对象创建与内存分配机制深度剖析" target="_blank">性能调优专题(11)之JVM对象创建与内存分配机制深度剖析</a> <span class="text-muted">技术路上的苦行僧</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E4%B8%93%E9%A2%98/1.htm">性能调优专题</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/JVM%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/1.htm">JVM内存布局</a><a class="tag" taget="_blank" href="/search/jvm%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D/1.htm">jvm内存分配</a><a class="tag" taget="_blank" href="/search/jvm%E5%86%85%E5%AD%98%E5%9B%9E%E6%94%B6/1.htm">jvm内存回收</a> <div>一、对象创建对象创建的主要流程:1.1.类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。1.2.分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小</div> </li> <li><a href="/article/1891123804843864064.htm" title="android 使用wifi进行adb调试" target="_blank">android 使用wifi进行adb调试</a> <span class="text-muted">huangmingcsdn</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a> <div>1.确认使用usb线连接android后adb调试成功2.android和电脑连接同一个局域网,记录androidip3.下载android终端模拟器Terminal4.打开android终端模拟器,输入命令,开启androidadb调试端口setpropservice.adb.tcp.port5555stopadbdstartadbd5.打开cmd窗口,输入命令adbconnectip</div> </li> <li><a href="/article/1891119645474222080.htm" title="备战蓝桥杯:贪心算法之货仓选址" target="_blank">备战蓝桥杯:贪心算法之货仓选址</a> <span class="text-muted">无敌大饺子 1</span> <a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>当我们货仓选址在最中间的时候,货仓到每家商店的距离最短#include#include#includetypedeflonglongLL;usingnamespacestd;intn;constintN=1e5+10;LLa[N];intmain(){cin>>n;for(inti=1;i>a[i];sort(a+1,a+1+n);LLret=0;for(inti=1;i=|a-b|我们的代码也可</div> </li> <li><a href="/article/1891094545148473344.htm" title="android studio 使用maven-publish 插件上传aar到远程maven仓库" target="_blank">android studio 使用maven-publish 插件上传aar到远程maven仓库</a> <span class="text-muted">-优势在我</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>上传插件编写1、在工程目录下添加upload.gradle文件applyplugin:'maven-publish'defRELEASE_REPOSITORY_URL='http://xxx.xx.com/artifactory/repository/release/'defSNAPSHOT_REPOSITORY_URL='http://xxx.xx.com/artifactory/reposit</div> </li> <li><a href="/article/1891094418874757120.htm" title="python如何将数据生成excel_Python如何将数据导出excel的技巧分享" target="_blank">python如何将数据生成excel_Python如何将数据导出excel的技巧分享</a> <span class="text-muted">weixin_39528697</span> <div>本篇文章主要介绍了python技能之导出excel的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧本文介绍了python技能之导出excel的实例代码,正好能用到,写出来分享给大家作为一个数据分析师,下面的需求是经常会遇到的。从数据库或者现有的文本文件中提取符合要求的数据,做一个二次处理,处理完成后的数据最终存储到excel表格中供其他部门的人继续二次分析。在</div> </li> <li><a href="/article/1891090380359790592.htm" title="【C++】STL之string类源码剖析" target="_blank">【C++】STL之string类源码剖析</a> <span class="text-muted">AllinTome</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/STL/1.htm">STL</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB%E4%B8%8E%E5%AF%B9%E8%B1%A1/1.htm">类与对象</a><a class="tag" taget="_blank" href="/search/string/1.htm">string</a> <div>目录概述源码MyString.htest.cpp概述string是字符串类,出现早于STL,不过string完全符合STL标准库的语法规则,故将string类也归于STL中string类实现的功能有字符串元素的随机访问、迭代器遍历、字符串追加/删减/查找、字符串随机插入、字符串扩容与修改长度、重载输入/输出运算符算法设计:利用构造临时对象、自定义swap函数,完成string对象的拷贝、赋值构造,</div> </li> <li><a href="/article/1891090002285228032.htm" title="Python数据处理之导入导出Excel数据" target="_blank">Python数据处理之导入导出Excel数据</a> <span class="text-muted">master_chenchengg</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%83%BD%E5%8A%9B%E6%8F%90%E5%8D%87/1.htm">能力提升</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8/1.htm">面试宝典</a><a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a><a class="tag" taget="_blank" href="/search/IT%E4%BF%A1%E6%81%AF%E5%8C%96/1.htm">IT信息化</a> <div>Python数据处理之导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档?准备工作:让Python与Excel握手言欢数据入境:把Excel表格里的宝藏带入Python世界数据出境:将Python分析结果优雅地送回Excel家园玩转数据:用Python对Excel数据进行清洗、转换和分析自动化魔法:编写Python脚本实现Excel数据处理自动化跨界合作:整合其他</div> </li> <li><a href="/article/1891089119723974656.htm" title="Android Studio之解决Gradle下载报错" target="_blank">Android Studio之解决Gradle下载报错</a> <span class="text-muted">Metaverse达爷</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>作者:达爷使用软件:AndroidStudio前言最近在做Unity到AndroidStudio的适配,因为AndroidStudio迭代速度过快的缘故,许多小伙伴隔几天打开项目时会发现项目的配置文件需要更新,但由于考虑到科学上网等因素,发现配置文件更新速度较慢,项目卡在启动配置阶段导致项目无法打开。作者之前也遇到过这个问题,为此在尝试了许多现有的办法后,总结出来一套比较快速可行的解决方法,现分享</div> </li> <li><a href="/article/1891084205203451904.htm" title="自动驾驶---Motion Planning之参考线Path平滑" target="_blank">自动驾驶---Motion Planning之参考线Path平滑</a> <span class="text-muted">智能汽车人</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E9%A9%BE%E9%A9%B6/1.htm">自动驾驶</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>1背景有了由lane_segment插值得到的粗糙参考线,这种参考线是无法输出给下游使用的,需要进一步的处理使得参考线更加平滑,才能供下游控制模块使用。Apollo中共有三种参考线平滑算法,分别为:1.QpSplineSmoother2.SpiralReferenceLineSmoother3.DiscretePointsSmoother目前Apollo中默认配置为最后一种,基于离散点的平滑。这种</div> </li> <li><a href="/article/1891084205635465216.htm" title="自动驾驶---Motion Planning之LaneChange" target="_blank">自动驾驶---Motion Planning之LaneChange</a> <span class="text-muted">智能汽车人</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E9%A9%BE%E9%A9%B6/1.htm">自动驾驶</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>1背景在Apollo中,有比较多的Decider(决策器),上篇博客《自动驾驶---MotionPlanning之Decider》中笔者也大概介绍了每个Deicder的作用。本篇博客笔者主要介绍换道的决策内容,因为在自动驾驶中(严格意义上来讲,目前还属于辅助驾驶),变道的灵活性是用户评价该功能是否好用很重要的一部分,变道迟缓或者激进都是不好的体验,所以本篇博客会结合Apollo中的LaneChan</div> </li> <li><a href="/article/1891078408083927040.htm" title="C++效率掌握之STL库:string底层剖析" target="_blank">C++效率掌握之STL库:string底层剖析</a> <span class="text-muted">DARLING Zero two♡</span> <a class="tag" taget="_blank" href="/search/C%2B%2B%E5%88%9D%E9%98%B6/1.htm">C++初阶</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/stl/1.htm">stl</a><a class="tag" taget="_blank" href="/search/string/1.htm">string</a> <div>文章目录1.学习string底层的必要性2.string类对象基本函数实现3.string类对象的遍历4.string类对象的扩容追加5.string类对象的插入、删除6.string类对象的查找、提取、大小调整7.string类对象的流输出、流提取希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!了解完string函数的主要用法,很有必要对string进行深层次的剖析,进一步了解其</div> </li> <li><a href="/article/1891071852466466816.htm" title="EtherCAT主站IGH-- 51 -- IGH之控制电机旋转位置模式(PP模式)" target="_blank">EtherCAT主站IGH-- 51 -- IGH之控制电机旋转位置模式(PP模式)</a> <span class="text-muted">常驻客栈</span> <a class="tag" taget="_blank" href="/search/EtherCAT%E4%B8%BB%E7%AB%99-IGH/1.htm">EtherCAT主站-IGH</a><a class="tag" taget="_blank" href="/search/EtherCAT/1.htm">EtherCAT</a><a class="tag" taget="_blank" href="/search/IGH/1.htm">IGH</a><a class="tag" taget="_blank" href="/search/EtherCAT%E4%B8%BB%E7%AB%99/1.htm">EtherCAT主站</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>EtherCAT主站IGH--51--IGH之控制电机旋转位置模式(PP模式)0Ubuntu18.04系统IGH博客、视频欣赏链接一代码实现二编译运行该文档修改记录:总结环境:系统:ubuntu18.04,xenomai3.1主站:IGH电机:松下A6B。该博客功能视频欣赏EtherCAT主站-IGH--51--ubuntu18控制电机旋转(PP模式)0Ubuntu18.04系统IGH博客、视频欣</div> </li> <li><a href="/article/87.htm" title="面向对象面向过程" target="_blank">面向对象面向过程</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>面向对象:把要完成的一件事,通过对象间的协作实现。 面向过程:把要完成的一件事,通过循序依次调用各个模块实现。 我把大象装进冰箱这件事为例,用面向对象和面向过程实现,都是用java代码完成。 1、面向对象 package bigDemo.ObjectOriented; /** * 大象类 * * @Description * @author FuJian</div> </li> <li><a href="/article/214.htm" title="Java Hotspot: Remove the Permanent Generation" target="_blank">Java Hotspot: Remove the Permanent Generation</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a> <div>  openjdk上关于hotspot将移除永久带的描述非常详细,http://openjdk.java.net/jeps/122   JEP 122: Remove the Permanent Generation Author Jon Masamitsu Organization Oracle Created 2010/8/15 Updated 2011/</div> </li> <li><a href="/article/341.htm" title="正则表达式向前查找向后查找,环绕或零宽断言" target="_blank">正则表达式向前查找向后查找,环绕或零宽断言</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>向前查找和向后查找 1. 向前查找:根据要匹配的字符序列后面存在一个特定的字符序列(肯定式向前查找)或不存在一个特定的序列(否定式向前查找)来决定是否匹配。.NET将向前查找称之为零宽度向前查找断言。     对于向前查找,出现在指定项之后的字符序列不会被正则表达式引擎返回。 2. 向后查找:一个要匹配的字符序列前面有或者没有指定的</div> </li> <li><a href="/article/468.htm" title="BaseDao" target="_blank">BaseDao</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/seda/1.htm">seda</a> <div> import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.ResultSet; public class BaseDao { public Conn</div> </li> <li><a href="/article/595.htm" title="Ant标签详解--Java命令" target="_blank">Ant标签详解--Java命令</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/Java%E5%91%BD%E4%BB%A4/1.htm">Java命令</a> <div>        这一篇主要介绍与java相关标签的使用         终于开始重头戏了,Java部分是我们关注的重点也是项目中用处最多的部分。           1</div> </li> <li><a href="/article/722.htm" title="[简单]代码片段_电梯数字排列" target="_blank">[简单]代码片段_电梯数字排列</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a> <div>       今天看电梯数字排列是9 18 26这样呈倒N排列的,写了个类似的打印例子,如下:       import java.util.Arrays; public class 电梯数字排列_S3_Test { public static void main(S</div> </li> <li><a href="/article/849.htm" title="Hessian原理" target="_blank">Hessian原理</a> <span class="text-muted">云端月影</span> <a class="tag" taget="_blank" href="/search/hessian%E5%8E%9F%E7%90%86/1.htm">hessian原理</a> <div>Hessian 原理分析 一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协</div> </li> <li><a href="/article/976.htm" title="区分Activity的四种加载模式----以及Intent的setFlags" target="_blank">区分Activity的四种加载模式----以及Intent的setFlags</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>  在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式: standard singleTop</div> </li> <li><a href="/article/1103.htm" title="hibernate几个核心API及其查询分析" target="_blank">hibernate几个核心API及其查询分析</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a> <div>(一)  org.hibernate.cfg.Configuration类         读取配置文件并创建唯一的SessionFactory对象.(一般,程序初始化hibernate时创建.)         Configuration co</div> </li> <li><a href="/article/1230.htm" title="PL/SQL的流程控制" target="_blank">PL/SQL的流程控制</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E7%BC%96%E7%A8%8B/1.htm">PL/SQL编程</a><a class="tag" taget="_blank" href="/search/%E5%BE%AA%E7%8E%AF%E6%8E%A7%E5%88%B6/1.htm">循环控制</a> <div>PL/SQL也是一门高级语言,所以流程控制是必须要有的,oracle数据库的pl/sql比sqlserver数据库要难,很多pl/sql中有的sqlserver里面没有   流程控制; 分支语句 if 条件 then 结果 else 结果 end if ; 条件语句 case when 条件 then 结果; 循环语句 loop </div> </li> <li><a href="/article/1357.htm" title="强大的Mockito测试框架" target="_blank">强大的Mockito测试框架</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>一.自动生成Mock类        在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。二.自动注入Mock类到被测试类  &nbs</div> </li> <li><a href="/article/1484.htm" title="精通Oracle10编程SQL(11)开发子程序" target="_blank">精通Oracle10编程SQL(11)开发子程序</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *开发子程序 */ --子程序目是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用程序中多次调用 --PL/SQL有两种类型的子程序:过程和函数 --开发过程 --建立过程:不带任何参数 CREATE OR REPLACE PROCEDURE out_time IS BEGIN DBMS_OUTPUT.put_line(systimestamp); E</div> </li> <li><a href="/article/1611.htm" title="【EhCache一】EhCache版Hello World" target="_blank">【EhCache一】EhCache版Hello World</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a> <div>本篇是EhCache系列的第一篇,总体介绍使用EhCache缓存进行CRUD的API的基本使用,更细节的内容包括EhCache源代码和设计、实现原理在接下来的文章中进行介绍   环境准备 1.新建Maven项目   2.添加EhCache的Maven依赖 <dependency> <groupId>ne</div> </li> <li><a href="/article/1738.htm" title="学习EJB3基础知识笔记" target="_blank">学习EJB3基础知识笔记</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/ejb/1.htm">ejb</a> <div>最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零bug记录,这也让自己腾出不少时间补充知识。花了两天时间把“传智播客EJB3.0”看完了,EJB基本的知识也有些了解,在这记录下EJB的部分知识,以供自己以后复习使用。   EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基</div> </li> <li><a href="/article/1865.htm" title="angular.bootstrap" target="_blank">angular.bootstrap</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/angular%E4%B8%AD%E6%96%87api/1.htm">angular中文api</a> <div>angular.bootstrap 描述:     手动初始化angular。     这个函数会自动检测创建的module有没有被加载多次,如果有则会在浏览器的控制台打出警告日志,并且不会再次加载。这样可以避免在程序运行过程中许多奇怪的问题发生。   使用方法:     angular .</div> </li> <li><a href="/article/1992.htm" title="java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数" target="_blank">java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class SearchInShiftedArray { /** * 题目:给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数。 * 请在这个特殊数组中找出给定的整数。 * 解答: * 其实就是“旋转数组”。旋转数组的最小元素见http://bylijinnan.iteye.com/bl</div> </li> <li><a href="/article/2119.htm" title="天使还是魔鬼?都是我们制造" target="_blank">天使还是魔鬼?都是我们制造</a> <span class="text-muted">ducklsl</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E6%83%85%E6%84%9F/1.htm">情感</a> <div>----------------------------剧透请原谅,有兴趣的朋友可以自己看看电影,互相讨论哦!!!     从厦门回来的动车上,无意中瞟到了书中推荐的几部关于儿童的电影。当然,这几部电影可能会另大家失望,并不是类似小鬼当家的电影,而是关于“坏小孩”的电影!     自己挑了两部先看了看,但是发现看完之后,心里久久不能平</div> </li> <li><a href="/article/2246.htm" title="[机器智能与生物]研究生物智能的问题" target="_blank">[机器智能与生物]研究生物智能的问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E7%89%A9/1.htm">生物</a> <div>       我想,人的神经网络和苍蝇的神经网络,并没有本质的区别...就是大规模拓扑系统和中小规模拓扑分析的区别....       但是,如果去研究活体人类的神经网络和脑系统,可能会受到一些法律和道德方面的限制,而且研究结果也不一定可靠,那么希望从事生物神经网络研究的朋友,不如把</div> </li> <li><a href="/article/2373.htm" title="获取Android Device的信息" target="_blank">获取Android Device的信息</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div> String phoneInfo = "PRODUCT: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; ph</div> </li> <li><a href="/article/2500.htm" title="最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现" target="_blank">最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D/1.htm">字符串匹配</a> <div>原文:http://www.javacodegeeks.com/2013/11/java-implementation-of-optimal-string-alignment.html------------------------------------------------------------------------------------------------------------</div> </li> <li><a href="/article/2627.htm" title="小学5年级英语单词背诵第一课" target="_blank">小学5年级英语单词背诵第一课</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a> <div>long 长的 show 给...看,出示 mouth 口,嘴 write 写   use 用,使用 take 拿,带来 hand 手 clever 聪明的   often 经常 wash 洗 slow 慢的 house 房子   water 水 clean 清洁的 supper 晚餐 out 在外   face 脸,</div> </li> <li><a href="/article/2754.htm" title="macvim的使用实战" target="_blank">macvim的使用实战</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mac/1.htm">mac</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>macvim用的是mac里面的vim, 只不过是一个GUI的APP, 相当于一个壳   1. 下载macvim https://code.google.com/p/macvim/   2. 了解macvim :h               vim的使用帮助信息 :h macvim  </div> </li> <li><a href="/article/2881.htm" title="java二分法查找" target="_blank">java二分法查找</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/java%E4%BA%8C%E5%88%86%E6%B3%95%E6%9F%A5%E6%89%BE/1.htm">java二分法查找</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E6%B3%95/1.htm">二分法</a><a class="tag" taget="_blank" href="/search/java%E4%BA%8C%E5%88%86%E6%B3%95/1.htm">java二分法</a> <div>java二分法查找 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年6月23日 11:40:03 星期二 http:/</div> </li> <li><a href="/article/3008.htm" title="Spring Cache注解+Memcached" target="_blank">Spring Cache注解+Memcached</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a> <div>Spring3.1 Cache注解  依赖jar包: <!-- simple-spring-memcached --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>simple-s</div> </li> <li><a href="/article/3135.htm" title="apache commons io包快速入门" target="_blank">apache commons io包快速入门</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/apache+commons/1.htm">apache commons</a> <div>原文参考 http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html   Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:   1)  工具类   2</div> </li> <li><a href="/article/3262.htm" title="如何学习编程" target="_blank">如何学习编程</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>首先,我想说一下学习思想.学编程其实跟网络游戏有着类似的效果.开始的时候,你会对那些代码,函数等产生很大的兴趣,尤其是刚接触编程的人,刚学习第一种语言的人.可是,当你一步步深入的时候,你会发现你没有了以前那种斗志.就好象你在玩韩国泡菜网游似的,玩到一定程度,每天就是练级练级,完全是一个想冲到高级别的意志力在支持着你.而学编程就更难了,学了两个月后,总是觉得你好象全都学会了,却又什么都做不了,又没有</div> </li> <li><a href="/article/3389.htm" title="架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy" target="_blank">架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a> <div>1.前言。    如题。 2.描述。    @DependsOn用于强制初始化其他Bean。可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean。 @DependsOn({"steelAxe","abc"}) @Comp</div> </li> <li><a href="/article/3516.htm" title="Spring4+quartz2的配置和代码方式调度" target="_blank">Spring4+quartz2的配置和代码方式调度</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a><a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a><a class="tag" taget="_blank" href="/search/quartz2.x/1.htm">quartz2.x</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/1.htm">定时任务</a> <div>前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……   quartz定时任务必须搞清楚几个概念: JobDetail——处理类 Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象 Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发</div> </li> <li><a href="/article/3643.htm" title="Hibernate入门" target="_blank">Hibernate入门</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>  前言   使用面向对象的语言和关系型的数据库,开发起来很繁琐,费时。由于现在流行的数据库都不面向对象。Hibernate 是一个Java的ORM(Object/Relational Mapping)解决方案。   Hibernte不仅关心把Java对象对应到数据库的表中,而且提供了请求和检索的方法。简化了手工进行JDBC操作的流程。   如</div> </li> <li><a href="/article/3770.htm" title="Math类" target="_blank">Math类</a> <span class="text-muted">xiaoxing598</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a> <div>一、Java中的数字(Math)类是final类,不可继承。 1、常数 PI:double圆周率 E:double自然对数 2、截取(注意方法的返回类型) double ceil(double d) 返回不小于d的最小整数 double floor(double d) 返回不大于d的整最大数 int round(float f) 返回四舍五入后的整数 long round</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>