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;
}
}
}
これは私には新しいものですが、難しいようです。あなたは多分私に、余裕を持っている人や他の誰かを教えてもらえますか?前もって感謝します! – MartijnG
[Painless Threading](http://developer.android.com/resources/articles/painless-threading.html)を見てください。あなたの 'isOnlineHost'チェックを' doInBackground'メソッドで行い、 'ProgressDialog'を' onPostExecute'で閉じます。 – Rajesh
私は今何かを得て、それは私が考える正しい方法で働いています。私の情報源を確認してもらえますか?また、shouldOverideUrlLoadingの中で同じAsyncTaskを使用することは可能ですか?どうやって教えてくれますか? – MartijnG