0

我有一个使用 WebView 的 Android 应用程序。在应用程序启动时,它会检查 WebView 是否可以连接到服务器。如果它可以连接没有问题,应用程序会立即加载并且 WebView 正在显示页面。但如果服务器不可用或连接不起作用,则需要几秒钟(5-10)才能显示错误消息。那是因为当您的连接速度较慢时,它不会连续显示错误消息。

因此,在没有连接的情况下,您会看到大约 5-10 秒的黑屏。我想要的只是应用程序启动时的一个简单的加载对话框。这样您就不会看到黑屏并且人们知道该应用程序正在执行某些操作。我怎样才能用最简单但有效的方法来归档这个?

谢谢!!

编辑:

好的,这就是我现在所拥有的,我认为它正在工作,但这是正确的方法吗?是否也可以在 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;
        }       
    }
}
4

2 回答 2

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

处理线程的完成。

于 2012-05-10T14:00:34.803 回答
0

在显示 时,使用AsyncTask来检查后台的连接性ProgressDialog。检查完成后关闭对话框。

于 2012-05-10T13:42:01.630 回答