2017-02-06 2 views
0

У меня есть список, и мне нужно отобразить все веб-сайты из этого списка в Loop один за другим в WebView. Между переходом с одного веб-сайта на другой я имею также индивидуальное время, которое также находится в другом списке с одинаковым размером.Android - Отображать URL-адреса в Webview из списка с разными временами один за другим

Но если я попытаюсь отобразить сайт в WebView, он иногда пропускает веб-сайт, а время неточно. Может кто-нибудь улучшить мой код, пожалуйста, и скажите мне, где это имеет значение?

public class WebshowActivity extends AppCompatActivity { 
private List<String> htmlSites = new ArrayList<>(); 
private List<Integer> timeForSite = new ArrayList<>(); 
private int counter = 0; 
WebView webView; 
boolean firstCall = true; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_webshow); 
    //Fullscreen settings 
    View decorView = getWindow().getDecorView(); 
    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; 
    decorView.setSystemUiVisibility(uiOptions); 
    //implement list from utils 
    timeForSite.add(10);//this is the 0th index and it's needed for the first URL load which is emepty 
    for (int i = 0; i < Utilities.list.size(); i++) { 
     htmlSites.add(Utilities.list.get(i).getPath()); 
     timeForSite.add(Utilities.list.get(i).getDuration()); 
    } 
    //WebView 
    webView = (WebView) findViewById(R.id.webview); 
    WebSettings webSettings = webView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webView.loadUrl(""); 
    webView.setWebViewClient(new WebViewClient() { 
     public void onPageFinished(WebView view, String url) { 
      Toast.makeText(WebshowActivity.this, "Time for this Website: " + timeForSite.get(counter) + "ms", Toast.LENGTH_SHORT).show(); 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        webView.loadUrl(htmlSites.get(counter)); 
        counter++; 
        if (firstCall == true) { 
         timeForSite.remove(0); 
         firstCall = false; 
        } else { 
         counter++; 
        } 
        if (counter == htmlSites.size()) { 
         counter = 0; 
        } 
       } 
      }, timeForSite.get(counter)); 
     } 
    }); 
} 

}

Перечни находятся в другом классе, но я думаю, что ошибка находится внутри onPageFinished метода.

ответ

0

ОБНОВЛЕНИЕ: Чтобы сделать планирование более точным с использованием таймера.

Вот пример:

public class MainActivity extends AppCompatActivity { 
    //mock 
    private static class SomeComplicatedObject { 
     private final String mPath; 
     private final Integer mDuration; 

     public SomeComplicatedObject(final String path, final int duration){ 
      mPath = path; 
      mDuration = duration; 
     } 

     String getPath() { return mPath; } 
     Integer getDureation() { return mDuration; } 
    } 

    private static final List<SomeComplicatedObject> complicatedList = new ArrayList<>(); 
    static { 
     complicatedList.add(new SomeComplicatedObject("http://google.com", 1000)); 
     complicatedList.add(new SomeComplicatedObject("http://facebook.com", 2000)); 
     complicatedList.add(new SomeComplicatedObject("http://google.com", 3000)); 
     complicatedList.add(new SomeComplicatedObject("http://twitter.com", 3000)); 
    } 

    private static final String TAG = "MainActivity"; 
    private final ArrayList<Pair<String, Integer>> mSitesToDisplay = new ArrayList<>(); 
    private final Timer mTimer = new Timer("LoadNext"); 
    private final Handler mHandler = new Handler(); 
    private WebView mWebView = null; 
    private int mIndex = -1; 

    private void fillSitesToDisplay(List<SomeComplicatedObject> list) { 
     mIndex = -1; 
     mSitesToDisplay.clear(); 
     for (SomeComplicatedObject item : list) { 
      mSitesToDisplay.add(new Pair<>(item.getPath(), item.getDureation())); 
     } 
    } 

    private Pair<String, Integer> getNext() { 
     mIndex = (mIndex+1) % mSitesToDisplay.size(); 
     return mSitesToDisplay.get(mIndex); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     fillSitesToDisplay(complicatedList); 
     View decorView = getWindow().getDecorView(); 
     int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; 
     decorView.setSystemUiVisibility(uiOptions); 

     mWebView = (WebView)findViewById(R.id.webview); 

     //initial start delayed by 1 sec 
     mTimer.schedule(createTimerTask(), TimeUnit.SECONDS.toMillis(1)); 
    } 

    private Runnable mDisplayNextPage = new Runnable() { 
     @Override 
     public void run() { 
      final Pair<String, Integer> pathTimePair = getNext(); 
      Log.e(TAG, "DisplayNext::run : Start loading next page : " + pathTimePair.first); 
      mWebView.setWebViewClient(new WaitPageLoadedClient(mTimer, createTimerTask(), pathTimePair.second)); 
      mWebView.loadUrl(pathTimePair.first); 
     } 
    }; 

    private TimerTask createTimerTask() { 
     return new TimerTriggered(mHandler, mDisplayNextPage); 
    } 

    //simple utility class for notifying timer triggered event 
    //on UI thread. 
    private static class TimerTriggered extends TimerTask { 
     Runnable mOnTriggered; 
     Handler mHandler; 

     protected TimerTriggered(Handler handler, Runnable onTriggered) { 
      super(); 
      mHandler = handler; 
      mOnTriggered = onTriggered; 
     } 

     @Override 
     public void run() { 
      //Timer runs int it's own thread so we need to 
      //pass execution to MainThread for accessing WebView. 
      mHandler.post(mOnTriggered); 
     } 
    } 

    private static class WaitPageLoadedClient extends WebViewClient { 
     private final TimerTask mRunOnFinished; 
     private final Timer mTimer; 
     private final Integer mDelay; 

     public WaitPageLoadedClient(Timer timer, TimerTask toRunOnFinished, Integer delay) { 
      mRunOnFinished = toRunOnFinished; 
      mTimer = timer; 
      mDelay = delay; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      Log.e(TAG, "onPageFinished: Schedule timer for " + mDelay); 
      mTimer.schedule(mRunOnFinished, mDelay); 
     } 
    } 
} 

Это будет цикл навсегда.

+0

спасибо! Он работает нормально, но у меня есть только проблема со временем. Это не всегда постоянно. –

+0

Чем вам нужен таймер или CountDownTimer вместо обработчика. Потому что обработчик полагается на поток пользовательского интерфейса, а не на то, чтобы его можно было назначать – j2ko

+0

@htlstudent. Я обновил ответ, используя таймер. Это должно быть более точно. – j2ko

Смежные вопросы