Timer 를 사용 하여 웹 페이지 의 등 속 로 딩 을 실현 하 는 진도 바 스타일

웹 뷰 를 사용 하여 웹 페이지 를 불 러 올 때 인터넷 속도 등 으로 로드 가 느 릴 때 웹 페이지 를 불 러 올 때 공백 구역 이 나타 나 지 않도록 사용자 에 게 좋 지 않 은 체험 감 을 주기 위해 우 리 는 로 딩 할 때 진도 항목 을 추가 하여 사용자 로 하여 금 웹 페이지 로 딩 의 진 도 를 직관 적 으로 느끼 게 한다.일반적으로 우 리 는 웹 크롬 클 라 이언 트 의 onProgressChanged()방법 을 통 해 현재 웹 페이지 로 딩 진 도 를 얻 을 수 있 습 니 다.그러나 우리 가 사용 할 때 그의 웹 페이지 로 딩 진 도 는 조금씩 로 딩 되 지 않 고 50%로 불 러 올 수도 있 습 니 다.다음 초 에 80%로 직접 불 러 올 수도 있 습 니 다.만약 에 우리 가 이 를 progressBar 에 설정 하면 빠 르 고 원활 하지 않 습 니 다.체험 감 이 비교적 좋 지 않 습 니 다.다음 그림 에서 보 듯 이 불 러 온 웹 페이지 진도:
这里写图片描述
만약 에 이렇게 진 도 를 progressBar 에 설정 하면 체험 감 이 상당히 떨어진다.다음 그림 과 같다.
这里写图片描述
지금 우 리 는 웹 페이지 를 불 러 올 때 사용자 에 게 고 른 속도 로 불 러 오 는 느낌 을 주 고 싶 습 니 다.비록 그 가 웹 페이지 를 진정 으로 불 러 오 는 진도 가 아니 지만,우 리 는 웹 페이지 가 처음 불 러 온 후 웹 페이지 로 딩 이 끝나 기 전에 고 른 속도 로 불 러 오 는 효 과 를 모 의 해 야 합 니 다.즉,웹 뷰 클 라 이언 트 의 onPageStarted()방법 을 다시 쓰 고 그 중에서 타 이 머 를 켜 는 것 입 니 다.onPageFinished()를 다시 쓰 고 타 이 머 를 닫 아 웹 페이지 를 고 르 게 불 러 오 는 효과 가 있 습 니 다.타 이 머 를 언급 하면 관련 된 것 을 말 할 수 밖 에 없습니다.
쉽게 말 하면 두 가지 로 나 뉘 는데 하 나 는 Timer 이 고 다른 하 나 는 timer 가 수행 할 계획 이나 임무(Task)입 니 다.이 임무(task)를 타이머(timer)에 설정 하고 타이머(timer)가 언제 임 무 를 수행 하 는 지 알려 주 는 것 입 니 다.임 무 는 우리 가 해 야 할 일 입 니 다.이렇게 말 하면 타이머 가 알 람(Timer)을 원한 다 고 할 수 있 습 니 다.임 무 는 우리 가 일어 나 는 것 과 같다.자명종 이 우리 가 설정 한 시간 까지 실 행 될 때(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 를 사용 하여 웹 페이지 의 등 속 로 딩 을 실현 하 는 진도 스타일 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기