2012-05-10 3 views
0

У меня есть приложение для Android, которое использует WebView. При запуске приложения он проверяет, может ли WebView подключиться к серверу или нет. Если он может подключиться, нет никаких проблем, приложение загружается мгновенно, и WebView показывает страницу. Но если сервер недоступен или соединение не работает, оно должно занять несколько секунд (5-10) до появления сообщения об ошибке. Это потому, что, когда у вас медленное соединение, оно не показывает сообщение об ошибке непрерывно.Диалог загрузки загрузки Android WebView

Таким образом, без подключения вы видите черный экран в течение примерно 5-10 секунд. Я хочу просто простой диалог загрузки при запуске приложения. Чтобы вы не видели черный экран, люди знают, что приложение что-то делает. Как я могу архивировать это самым простым, но эффективным способом?

спасибо !!

EDIT:

Хорошо это то, что теперь у меня есть, я думаю, что это работает, но это правильный путь? И можно ли использовать этот поток Async также в mustOverideUrlLoading? Как я могу это сделать?

public class WebviewActivity extends MainActivity { 

    private WebView myWebView; 
    private ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 

     final ScrollView mainScrollView = (ScrollView)findViewById(R.id.ScrollView01); 

     myWebView = (WebView)findViewById(R.id.webview); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 

     progressDialog = ProgressDialog.show(WebviewActivity.this, "", "Loading...", true); 

     myWebView.setWebViewClient(new WebViewClient(){ 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       progressDialog.show(); 

       if (isOnline() == false || isOnlineHost() == false) 
        myWebView.loadUrl("file:///android_asset/errorpage.html"); 
       else 
        view.loadUrl(url); 

       return true;     
      } 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       progressDialog.dismiss(); 
       mainScrollView.fullScroll(ScrollView.FOCUS_UP); 
      } 
     }); 

     myWebView.requestFocus(View.FOCUS_DOWN); 
     myWebView.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_UP: 
         if (!v.hasFocus()) { 
          v.requestFocus(); 
         } 
         break; 
       } 
       return false; 
      } 
     }); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig){   
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onResume() { 
     super.onResume();  
     new checkConnection().execute(); 
    } 

    //DOING THE CONNECTION CHECK IN ANOTHER THREAD 
    public class checkConnection extends AsyncTask<String, Integer, String>{   

     private ProgressDialog progressDialog;    

     protected void onPreExecute(){ 
      progressDialog = ProgressDialog.show(WebviewActivity.this, "", "Loading...", true); 
      progressDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      if (isOnline() == true && isOnlineHost() == true) 
       myWebView.loadUrl(webLink); 
      else 
       myWebView.loadUrl("file:///android_asset/errorpage.html"); 

      progressDialog.dismiss();   
      return null; 
     }  
    } 
} 

ответ

0

Используйте AsyncTask для проверки соединений в фоновом режиме во время ProgressDialog показан. Отключите диалог после завершения проверки.

+0

Это для меня что-то новое, выглядит тяжело. Не могли бы вы привести мне пример или кого-нибудь еще, у кого есть свободное время? Заранее спасибо! – MartijnG

+0

Взгляните на [Безболезненная резьба] (http://developer.android.com/resources/articles/painless-threading.html). Сделайте проверку 'isOnlineHost' в методе' doInBackground' и отпустите 'ProgressDialog' в' onPostExecute'. – Rajesh

+0

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

0

Убедитесь, что ваш класс реализует Runnable. Затем используйте что-то вроде:

private WebView myWebView; 
private ProgressDialog progressDialog; 

как глобальные переменные,

progressDialog = ProgressDialog.show(this, "Title", "Loading...", true, false); 

Thread thread = new Thread(this); 
thread.start(); 

Чтобы начать нить,

public void run() { 
      // Time consuming task 
    } 

Как что, в потоке, и

private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        // What to do when thread is finished 
        progressDialog.dismiss(); 
      } 
    }; 

Чтобы справиться с завершением нить.

+0

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

+1

Если вы можете дать мне изолированную часть трудоемкого кода, что делать по завершении, и скажите, с чего начать поток (я не могу извлечь это из вашего кода), я могу. – glen3b

+1

Я получил это уже сам, это лучший способ узнать это правильно;) – MartijnG

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