2012-05-10 29 views
0

WebViewを使用するAndroidアプリがあります。アプリケーションの起動時に、WebViewがサーバーに接続できるかどうかをチェックします。接続可能な場合は問題ありません。アプリがすぐに読み込まれ、WebViewがそのページを表示しています。ただし、サーバーが使用できない場合、または接続が機能しない場合は、エラーメッセージが表示されるまでに数秒(5-10)かかります。接続が遅い場合は、エラーメッセージが表示されないためです。スタートアップダイアログの読み込みAndroid WebView

接続していないと、約5-10秒間黒い画面が表示されます。私が望むのは、アプリケーションの起動時に単純な読み込みダイアログです。あなたは黒い画面が表示されないように、人々はアプリが何かをやっているのを知っている。どのように私は最も簡単で効果的な方法でこれを達成することができますか?

ありがとうございました!

EDIT:

オーケー、これは私が今持っているものですが、私はそれが働いていると思うが、これは正しい方法ですか?また、この非同期スレッドをshouldOverideUrlLoadingでも使用できますか?どうやってやるの?

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

ProgressDialogが示されているが、バックグラウンドでの接続性を確認するためにAsyncTaskを使用してください。チェックが完了したらダイアログを閉じます。

+0

これは私には新しいものですが、難しいようです。あなたは多分私に、余裕を持っている人や他の誰かを教えてもらえますか?前もって感謝します! – MartijnG

+0

[Painless Threading](http://developer.android.com/resources/articles/painless-threading.html)を見てください。あなたの 'isOnlineHost'チェックを' doInBackground'メソッドで行い、 'ProgressDialog'を' onPostExecute'で閉じます。 – Rajesh

+0

私は今何かを得て、それは私が考える正しい方法で働いています。私の情報源を確認してもらえますか?また、shouldOverideUrlLoadingの中で同じAsyncTaskを使用することは可能ですか?どうやって教えてくれますか? – MartijnG

0

クラスにRunnableが実装されていることを確認してください。スレッド、スレッドで実行何として

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(); 
      } 
    }; 

を開始するには、グローバル変数として

private WebView myWebView; 
private ProgressDialog progressDialog; 

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

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

:その後のようなものを使用完了を処理するには スレッド。

+0

あなたの答えをありがとう!でも、私は本当にこのことを理解していません。多分尋ねるべきことはありますが、自分のコードを使って私に例を挙げることはできますか?どうもありがとうございました! – MartijnG

+1

時間のかかるコードの孤立した部分、完了時の対処方法、スレッドの開始場所を教えてください(私はあなたのコードからそれを引き出すことはできません)。 – glen3b

+1

私はすでに自分でそれを得ました、それはそれを正しく学ぶための最善の方法です); – MartijnG

関連する問題