我有一个使用WebView的Android应用。在应用程序启动时,它会检查WebView是否可以连接到服务器。如果它可以连接没有问题,应用程序立即加载,WebView正在显示页面。但是,如果服务器不可用或连接不起作用,则在出现错误消息之前需要几秒钟(5-10)。那是因为当你的连接速度很慢时,它不会持续显示错误信息。
因此,如果没有连接,您会看到黑屏约5-10秒。我想要的只是在应用程序启动时的简单加载对话框。所以你没有看到黑屏,人们都知道应用程序在做什么。我怎样才能用最简单但最有效的方式来解决这个问题?
谢谢!
修改
好的,这就是我现在所拥有的,我认为它有效,但这是正确的方法吗?是否可以在shouldOverideUrlLoading中使用此Async线程?我怎么能这样做?
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 :(得分:0)
在显示AsyncTask
时,使用ProgressDialog
检查后台连接情况。检查完成后关闭对话框。
答案 1 :(得分: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();
}
};
处理线程的完成。