Как последовательно загружать URL - PullRequest
5 голосов
/ 14 марта 2011

Я хочу загружать URL один за другим. Я использовал массив String для хранения URL. Моё требование заключается в том, что если веб-просмотр загружает первый URL-адрес, он должен печатать сообщение «страница запущена», когда страница начинается и когда страница завершает еедолжен показать "страница закончена".После завершения загрузки первого URL-адреса он должен загрузить второй URL-адрес и продолжить тот же процесс.

Код, который я написал, выглядит следующим образом:

package com.browser;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class browser extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final String[] url={"http://www.yahoo.com","http://www.google.com","http://www.ibnlive.com"};
        final MyWebView mwv = new MyWebView(this); 
        mwv.setWebViewClient(new myweb()); 
        new Thread(new Runnable(){
            public void run(){
                Log.d("runThread","runthread");
                for(int i=0;i<2;i++){
                    openbrowser(url[i]);
                }

            }

            private void openbrowser(String url) {

                mwv.getSettings().setJavaScriptEnabled(true); 
                mwv.loadUrl(url);   
                Log.d("",""+url);
                setContentView(mwv);
            }
        }).start();
    }


    public class MyWebView extends WebView{

        public MyWebView(Context context) {
            super(context);

        }
    }
    public class myweb extends WebViewClient{
        @Override       
        public boolean shouldOverrideUrlLoading(WebView view, String url) { 
            System.out.println("LOADING");

            return false;
        }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            System.out.println("PageStarted: " + url);
        }

        @Override   
        public void onPageFinished(WebView view, String url){
            System.out.println("PageFinished: " + url);
        }
    }


    }
    ///indented code <--remove this

Загружается только последний URL-адрес.

Ответы [ 6 ]

5 голосов
/ 30 мая 2012

Попробуйте это ...

int position=0;

textview.setText("page started");
browser.loadUrl("your first url");
browser.setWebChromeClient(new WebChromeClient()
{
    public void onProgressChanged(WebView view, int progress) 
    {
       if(progress == 100)
       {
          textview.setText("page finished");
          if(position==0)
          {
            browser.loadUrl("your second url");
            position=1;
            textview.setText("page started");
          } 
          if(position==1)
          {
            browser.loadUrl("your third url");
            position=2;
            textview.setText("page started");
          } 
       }
    }
});

Вы также можете отобразить тост вместо TextView ..

5 голосов
/ 29 мая 2012

Вы можете использовать приведенный ниже код для загрузки по одному URL в веб-представлении. Этот код просто загружает URL-адреса один за другим, которые вы видите или видите не только все URL-адреса, но вы можете видеть последние.

public class WebViewsScreenActivity extends Activity {

    private WebView mwebview;
    int i =0;
    private WebViewsScreenActivity _activity;
    ProgressDialog _dilog;
    private String[] Urls = {"http://www.google.com","http://www.gmail.com","http://www.yahoo.com"}; 

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
         getWindow().requestFeature(Window.FEATURE_PROGRESS);  
        mwebview = new WebView(this);
        setContentView(mwebview);
        _activity = this;  
        mwebview.getSettings().setJavaScriptEnabled(true);
        mwebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

        if(checkInternetConnection(_activity)){
            if(savedInstanceState==null)    
                mwebview.loadUrl(Urls[i]);
            else
                mwebview.restoreState(savedInstanceState);
        }
        else{
            //showAlert  "Unable to Connect Server"
        }
         mwebview.setWebChromeClient(new WebChromeClient() {

                @Override
       public void onProgressChanged(WebView view, int progress) {
                 if(mwebview.getVisibility()==View.VISIBLE)
                 {
                 WebViewsScreenActivity.this.setProgress(progress * 100);

                 }
                }
              });
        mwebview.setWebViewClient(new HelloWebViewClient());
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            mwebview.goBack();
            return true;
        }
        else
            return super.onKeyUp(keyCode, event);
    }


    //To check whether network connection is available on device or not
    private boolean checkInternetConnection(Activity _activity) {
        ConnectivityManager conMgr = (ConnectivityManager) _activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected())
            return true;
        else
            return false;
    }//checkInternetConnection()



    //HelloWebViewClient class for webview
    private class HelloWebViewClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
                    Toast.makeText(getApplicationContext(), "Loading started...!"+Urls[i], Toast.LENGTH_SHORT).show();

        }
        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            // TODO Auto-generated method stub
            super.onReceivedError(view, errorCode, description, failingUrl);

        }
        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
                    Toast.makeText(getApplicationContext(), "Loading done...!"+Urls[i], Toast.LENGTH_SHORT).show();
            i++;
            if(i<Urls.length)
                view.loadUrl(Urls[i]);
        }
    } //HelloWebViewClient-class
}//AccountsScreenActivity-class

Добавьте разрешения в файле манифеста, как показано ниже: *

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vl.agarwal"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".WebViewsScreenActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
3 голосов
/ 29 мая 2012

Я попытался смоделировать и придумал следующее:

package com.mywebslider;


import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import android.widget.Toast;

public class WebSliderActivity extends Activity {

    TextView number;
    WebView mWebView;
    CountDownTimer mTimer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        number = (TextView) findViewById(R.id.number);
        mTimer=new CountDownTimer(15000, 1000) {

         String[] myArray={"http://www.upc.nl/","http://www.google.com","http://www.quickspot.nl"}; 


            int currentIndex=0; 
            public void onTick(long millisUntilFinished) {

                number.setText("seconds remaining: " + millisUntilFinished / 1000);
            }
             //code comment start
             // i think this part could be written better
             // but it works!!!
            public void onFinish() {
                if (currentIndex<myArray.length) {
                    number.setText("done!");
                    mWebView.loadUrl(myArray[currentIndex]);
                    currentIndex++;
                } else {
                    currentIndex=0;
                    if (currentIndex<myArray.length)
                    number.setText("done!");
                    mWebView.loadUrl(myArray[currentIndex]);
                    currentIndex++;
                    mTimer.start();
                }

                    mTimer.start();

            }
            //code comment end
         };

        mTimer.start();
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl("http://stackoverflow.com");
        mWebView.setWebViewClient(new WebSliderWebViewClient(){
        @Override  
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(mWebView, url);
            Toast.makeText(getApplicationContext(), "Done!", Toast.LENGTH_SHORT).show();

        }  

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
           Toast.makeText(getApplicationContext(), "Oh no! " + description, Toast.LENGTH_SHORT).show();

        }
    });


    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private class WebSliderWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
}

Помимо того, что это работает, цикл массива можно сделать лучше.Файл main.xml должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView 
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="0dp" 
    android:layout_weight="1"
    />

<TextView  
   android:id="@+id/number" 
   android:layout_width="fill_parent"
   android:layout_height="0dp" 
   android:layout_weight="1"
    />

</LinearLayout>

На выходе будет отображаться экран 50/50.Один для WebView, а другая половина показывает счетчик в TextView.

2 голосов
/ 31 мая 2012

Попробуйте закодировать расширение WebViewClient, чтобы уведомить свою активность после завершения загрузки.Я пытался изменить ваш код, чтобы сделать это:

package com.browser;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Browser extends Activity {

private MyWebView mwv = null;
private MyWeb myweb = null;
private List<String> urls = null;
private String[] url = new String[] {"http://www.yahoo.com","http://www.google.com","http://www.ibnlive.com"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mwv = new MyWebView(this);
    myweb = new MyWeb(this);
    mwv.setWebViewClient(myweb); 
    urls = Arrays.asList(url);
    loadNextUrl(null);
}

private loadNextUrl(String fromUrl) {
    if (fromUrl == null) {
        myweb.setOriginalUrl(urls.get(0));
        mwv.loadUrl(urls.get(0));
    } else {
        if (urls.indexOf(fromUrl) == urls.size() - 1) return;
        String newUrl = urls.get(urls.indexOf(fromUrl) + 1);
        myweb.setOriginalUrl(newUrl);
        mwv.loadUrl(newUrl);
    }
}


public class MyWebView extends WebView{

    public MyWebView(Context context) {
        super(context);

    }
}
public class MyWeb extends WebViewClient{
    Browser activity = null;

    // Prevent redirects from messing with URL array
    String originalUrl = null;

    public MyWeb(Browser activity) {
        this.activity = activity;
    }

    public setOriginalUrl(String url) {
        this.originalUrl = url;
    }

    @Override       
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        System.out.println("LOADING");

        return false;
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        System.out.println("PageStarted: " + url);
    }

    @Override   
    public void onPageFinished(WebView view, String url){
        System.out.println("PageFinished: " + url);
        activity.loadNextUrl(originalUrl);
    }
}


}
2 голосов
/ 15 августа 2011

Проблема в том, что вы не ждете, пока onPageStarted () и onPageFinished что-нибудь вернут. Вместо этого ваш код просто загружает URL-адреса один за другим так быстро, что вы видите только последний.

Вам нужно изменить цикл for (), чтобы он дождался возврата метода onPagefinished () перед загрузкой другой страницы.

1 голос
/ 02 июня 2012

Вы можете использовать очередь для хранения URL, которые должны быть загружены одна за другой.

Queue<String> mQueue = new LinkedList<String>();
...

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    mQueue.add("http://url1");
    mQueue.add("http://url2");
    mQueue.add("http://urln");
    ...
    String url = mQueue.remove();
    mwv.loadurl(url);
}
...
public class myweb extends WebViewClient{
    @Override       
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        System.out.println("LOADING");

        return false;
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        System.out.println("PageStarted: " + url);
    }

    @Override   
    public void onPageFinished(WebView view, String url){
        System.out.println("PageFinished: " + url);
        String url = null;
        url = mQueue.remove();
        if (url != null) {
            view.loadUrl(url);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...