Java Android在加载url时向webview添加不确定的进度条

Java Android在加载url时向webview添加不确定的进度条,java,android,webview,android-progressbar,Java,Android,Webview,Android Progressbar,嗨,我正在尝试为我的webview实现一个进度条,它在等待webview加载时弹出。我见过几种方法,但我不确定哪种方法是最好的 布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_h

嗨,我正在尝试为我的webview实现一个进度条,它在等待webview加载时弹出。我见过几种方法,但我不确定哪种方法是最好的

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>
    public class MapActivity extends MenuActivity {

private final static String TAG = "HearingTest";
private WebView webView;
private String urlString;
private ProgressDialog progressDialog;
private Context context;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);

    urlString = getString(R.string.location_url);

    WebViewSettings();

    LoadWebPage(urlString);

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
            progressDialog = new ProgressDialog(context);
            progressDialog.setTitle("Loading...");
            progressDialog.setMessage("Please wait.");
            //progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                //Do something...
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (progressDialog!=null) {
                progressDialog.dismiss();
            }
        }
    };

    task.execute((Void[])null);
}

public void LoadWebPage(String url){

    try {
        webView.loadUrl(url);
        Log.d(TAG, "URL" + url + "connected");
    } 
    catch (Exception e) {
            Log.d(TAG, "URL: " + url + " couldn't connect.");
    }
}

public void WebViewSettings(){

    webView = (WebView) findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setLoadWithOverviewMode(true);

    webView.setWebViewClient(new WebViewClient(){

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals(urlString)) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

        @Override
        public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
             handler.proceed();
        }
    });
}

    protected void DisplayProgressBar(){

    }
}

我以编程方式创建进度条

活动:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>
    public class MapActivity extends MenuActivity {

private final static String TAG = "HearingTest";
private WebView webView;
private String urlString;
private ProgressDialog progressDialog;
private Context context;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);

    urlString = getString(R.string.location_url);

    WebViewSettings();

    LoadWebPage(urlString);

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
            progressDialog = new ProgressDialog(context);
            progressDialog.setTitle("Loading...");
            progressDialog.setMessage("Please wait.");
            //progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                //Do something...
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (progressDialog!=null) {
                progressDialog.dismiss();
            }
        }
    };

    task.execute((Void[])null);
}

public void LoadWebPage(String url){

    try {
        webView.loadUrl(url);
        Log.d(TAG, "URL" + url + "connected");
    } 
    catch (Exception e) {
            Log.d(TAG, "URL: " + url + " couldn't connect.");
    }
}

public void WebViewSettings(){

    webView = (WebView) findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setLoadWithOverviewMode(true);

    webView.setWebViewClient(new WebViewClient(){

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals(urlString)) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

        @Override
        public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
             handler.proceed();
        }
    });
}

    protected void DisplayProgressBar(){

    }
}
公共类MapActivity扩展了MenuActivity{
私有最终静态字符串TAG=“HearingTest”;
私有网络视图;
私有字符串urlString;
私有进程对话;
私人语境;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.map\u布局);
urlString=getString(R.string.location\uURL);
WebViewSettings();
加载网页(URL字符串);
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
progressDialog=新建progressDialog(上下文);
progressDialog.setTitle(“加载…”);
progressDialog.setMessage(“请稍候”);
//progressDialog.setCancelable(假);
progressDialog.setUndeterminate(true);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
试一试{
//做点什么。。。
睡眠(5000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
如果(progressDialog!=null){
progressDialog.disclose();
}
}
};
task.execute((Void[])null);
}
公共无效加载网页(字符串url){
试一试{
loadUrl(url);
Log.d(标记“URL”+URL+“connected”);
} 
捕获(例外e){
Log.d(标记“URL:+URL+”无法连接);
}
}
public void WebViewSettings(){
webView=(webView)findviewbyd(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuilTinZoomControl(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setLoadWithOverview模式(true);
setWebViewClient(新的WebViewClient(){
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
if(Uri.parse(url.getHost().equals(urlString)){
//这是我的网站,所以不要覆盖;让我的WebView加载页面
返回false;
}
//否则,该链接不适用于我的站点上的页面,因此启动另一个处理URL的活动
Intent Intent=newintent(Intent.ACTION_视图,Uri.parse(url));
星触觉(意向);
返回true;
}
@凌驾
ReceivedSlerRor上的公共无效(WebView视图、SslErrorHandler、SslError错误){
handler.procedure();
}
});
}
受保护的void DisplayProgressBar(){
}
}
我的问题是我真的不知道最好的方法是什么。以我目前的方式,当我创建一个新的进度条实例时,我得到一个空指针异常,我不知道为什么!另外,我真的不知道我是否在用最好的方式做这件事,因为我已经看到了用线程做这件事的另一种方式


如果有人能帮我解决我的问题或告诉我一个更好的解决方案,我将不胜感激。

上下文是空的,这可能就是为什么你会得到
NullPointerException


使用
context=MapActivity初始化
context
onCreate中

非常感谢您的帮助,新建它将非常简单。另一件事是我不知道受保护的Void doin background(Void…arg0)
用于什么,因为它实际上什么都不做,为什么需要此方法?
doInBackground
是在后台执行的异步任务。它用于执行可能需要很长时间才能完成的(后台)操作(例如:从服务器请求数据)。您可以在此处阅读有关AsyncTask的更多信息