使用Timer实现网页匀速加载的进度条样式

发布时间 - 2026-01-10 22:39:11    点击率:

在使用WebView加载网页时有时候网速等原因加载比较慢时,为了避免在加载网页的时候出现一片空白的区域,给用户很不好的体验感,我们往往在加载的时候添加一个进度条,使用户直观的感受到网页加载的进度,通常我们可以通过WebChromeClient里面的onProgressChanged()方法获取到当前的网页加载进度,但是当我们使用时会发现他的网页加载进度不是一点一点加载的,也许一下就加载到50%下一秒直接加载到80%,如果我们将其设置给progressBar看起来就很快而且很不顺畅,体验感较差,如下图所示加载的网页进度:

假如这样将其进度设置到progressBar的体验感就相当的差,如下图所示:

现在我们希望想要其在加载网页的时候希望给用户一种匀速加载的感觉,尽管他不是网页真正加载的进度,但我们只需要在网页刚开始加载后和网页加载结束前模拟一个匀速加载的效果,也就是重写WebViewClient的onPageStarted()方法,在其中开启一个定时器,重写onPageFinished(),将定时器关闭掉,达到匀速加载网页的效果,提到定时器,就不得不说一下相关的东西了。

简单来说就分成两个东西,一个Timer,另外一个就是timer的所要执行的计划或者说是任务(Task),将这个任务(task)设置给定时器(timer),告诉定时器(timer)什么时候执行任务(Task),而任务就是我们要要干的事,可以这样说定时器想一个闹钟(Timer),任务相当于我们起床(任务Task),当闹钟执行到我们设置的时间时(schedule),就提醒我们该起床了

Timer执行指定的任务可以有一下几种方法

//在指定的时间执行指定的任务。
 public void schedule(TimerTask task, Date when) {}
 //延迟指定时间后执行指定的任务
 public void schedule(TimerTask task, long delay) {}
 //按设置延迟时间和时间间隔重复执行指定的任务
 public void schedule(TimerTask task, long delay, long period) {}
 //在指定的时间和时间间隔重复执行指定的任务
 public void schedule(TimerTask task, Date when, long period) {}

在onPageStarted()我们通过开启一个定时器,每隔50ms开始progress+1,直到onPageFinished()取消定时器
package com.example.timerdemo;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
 private ProgressBar progressbar;
 private Activity _rootActivity;
 private WebView webView;
 private WebClient webClient;
 private Timer timer = new Timer();
 private int currentProgress = 0;
 String url = "http://appagent.gyfc.net.cn/NewHouse/index";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  progressbar = (ProgressBar) findViewById(R.id.web_progressbar);
  webView = (WebView) findViewById(R.id.webView);
  webClient = new WebClient();
  webView.setWebViewClient(webClient);
  webView.setWebChromeClient(new WebChromeClient(){
   @Override
   public void onProgressChanged(WebView view, int newProgress) {
    super.onProgressChanged(view, newProgress);
    if (newProgress == 100) {
     stopTimeTask();
     progressbar.setVisibility(View.GONE);
    } else {
     if (newProgress > currentProgress) {
      progressbar.setProgress(newProgress);
      currentProgress = newProgress;
     }
    }
   }
  });
  findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    webView.loadUrl(url);
   }
  });
 }
 class WebClient extends WebViewClient{
  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {   super.onPageStarted(view, url, favicon);
   startTimeTask();
  }
  @Override
  public void onPageFinished(WebView view, String url) {
   // TODO Auto-generated method stub
   super.onPageFinished(view, url);
   stopTimeTask();
  }
 }
 /**
  * 启动定时器
  */
 private void startTimeTask() {
  stopTimeTask();
  timer = new Timer();
  timer.schedule(new TimerTask() {
   @Override
   public void run() {
    runOnUiThread(new Runnable() {
     @Override
     public void run() {
      // TODO Auto-generated method stub
      if (currentProgress < 90) {
       currentProgress += 1;
       progressbar.setProgress(currentProgress);
      } else {
       stopTimeTask();
      }
     }
    });
   }
  }, 0, 50);
 }
 /**
  * 关闭定时器
  */
 private void stopTimeTask() {
  if (timer != null) {
   timer.cancel();
   timer = null;
  }
 }
}
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
  <ProgressBar
   android:id="@+id/web_progressbar"
   style="?android:attr/progressBarStyleHorizontal"
   android:layout_width="match_parent"
   android:layout_height="3dp"
   android:progressDrawable="@drawable/progressbar_bg_style" />
  <WebView
   android:id="@+id/webView"
   android:layout_below="@id/web_progressbar"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />
  <Button 
   android:id="@+id/btn"
   android:layout_width="match_parent"
   android:layout_height="40dp"
   android:text="加载网页"
   android:layout_alignParentBottom="true"
   android:background="#e5e5e5"/>
</RelativeLayout>

执行效果如下所示:

以上所述是小编给大家介绍的使用Timer实现网页匀速加载的进度条样式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# timer实现网页进度条  # timer  # 实现进度条  # 加载  # 所示  # 将其  # 重写  # 小编  # 如下图  # 进度条  # 在此  # 什么时候  # 只需  # 要在  # 我们可以  # 给大家  # 刚开始  # 当我们  # 另外一个  # 所要  # 很不  # 每隔  # 所述 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何实现建站之星域名转发设置?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何自定义建站之星网站的导航菜单样式?  如何快速选择适合个人网站的云服务器配置?  用yum安装MySQLdb模块的步骤方法  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  在线教育网站制作平台,山西立德教育官网?  如何快速搭建高效WAP手机网站吸引移动用户?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何在宝塔面板中创建新站点?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  魔方云NAT建站如何实现端口转发?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  PythonWeb开发入门教程_Flask快速构建Web应用  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Swift中switch语句区间和元组模式匹配  Python结构化数据采集_字段抽取解析【教程】  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何用腾讯建站主机快速创建免费网站?  如何自定义建站之星模板颜色并下载新样式?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  详解CentOS6.5 安装 MySQL5.1.71的方法  Python文本处理实践_日志清洗解析【指导】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何为不同团队 ID 动态生成多个“认领值班”按钮  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  香港服务器部署网站为何提示未备案?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  奇安信“盘古石”团队突破 iOS 26.1 提权  如何基于云服务器快速搭建网站及云盘系统?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel如何发送系统通知?(Notification渠道示例)  javascript基于原型链的继承及call和apply函数用法分析