【问题标题】:Android progressBar random crash with nullPointerException, can't understand whyAndroid progressBar随机崩溃与nullPointerException,不明白为什么
【发布时间】:2011-10-21 19:47:43
【问题描述】:

这是我用来加载页面的选项卡之一。

package realstrat.cfostudio.magazineapp;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import realstrat.cfostudio.magazineapp.R;

public class TabActivity3 extends Activity {
    WebView mWebView;
    private ProgressDialog progressBar;

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

        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setPluginsEnabled(true);
        mWebView.loadUrl("--company URL--");

        mWebView.setWebViewClient(new FirstTabWebViewClient());        
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
          savedInstanceState.putBoolean("OverviewMode", mWebView.getSettings().getLoadWithOverviewMode());
          mWebView.saveState(savedInstanceState);
          super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
          super.onRestoreInstanceState(savedInstanceState);

          ((WebView)findViewById(R.id.webview1)).restoreState(savedInstanceState);
          if (savedInstanceState.getBoolean("OverviewMode") == false) {
              ((WebView)findViewById(R.id.webpageview)).getSettings().setLoadWithOverviewMode(false);
              ((WebView)findViewById(R.id.webpageview)).getSettings().setUseWideViewPort(false);                
          }
          else {
              ((WebView)findViewById(R.id.webpageview)).getSettings().setLoadWithOverviewMode(true);
              ((WebView)findViewById(R.id.webpageview)).getSettings().setUseWideViewPort(true);
          }          
          return;
    }

    private class FirstTabWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
          // YouTube video link
        if (url.startsWith("vnd.youtube"))
            {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return (true);
            }
        if (url.endsWith("-m.html")){
            mWebView.getSettings().setLoadWithOverviewMode(false);
            mWebView.getSettings().setUseWideViewPort(false);               
        }
        else {
            mWebView.getSettings().setLoadWithOverviewMode(true);
            mWebView.getSettings().setUseWideViewPort(true);
        }

          view.loadUrl(url);
          return true;
        }

        public void onPageStarted(WebView view, String url, Bitmap favicon){
            progressBar = ProgressDialog.show(TabActivity3.this, "", "Loading...", true);

        }

        public void onPageFinished(WebView view, String url) {
            progressBar.hide();

            if (url.endsWith("-m.html")){
                mWebView.getSettings().setLoadWithOverviewMode(false);
                mWebView.getSettings().setUseWideViewPort(false);               
            }
            else {
                mWebView.getSettings().setLoadWithOverviewMode(true);
                mWebView.getSettings().setUseWideViewPort(true);
            }
            return;
        }
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Context context = getApplicationContext();
            CharSequence text = "Desc: " + description;
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
            return;
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

偶尔它会在 onPageFinished() 下的 progressBar.hide() 行出现 nullPointerException 崩溃。这没有任何意义,因为 onPageStarted() 启动 progressBar,并且 onPageStarted 总是在 onPageFinished() 之前。这是为什么呢?

这种情况只会发生 10 次左右,这让我很困惑。

通常(总是?)在第一次启动活动时发生。

【问题讨论】:

    标签: android webview progress-bar progressdialog


    【解决方案1】:

    试试这个

    if(progressBar!=null)
           progressBar.hide();
    

    【讨论】:

    • 这就是我最终做的,但你知道为什么会这样吗??
    • 如果不进行调试,我无法确定您可以在 onPageStarted 、 onPageFinished 和 onCreate 上放置断点以查看会发生什么
    【解决方案2】:

    也许 Activity 在两个回调之间重新启动?尝试在显示进度条时旋转手机以查看结果。

    【讨论】:

    • 当我这样做时,它会回到它试图加载的任何内容之前。当它崩溃时,虽然进度条甚至没有出现。
    【解决方案3】:

    尝试将进度条加载为单例对象。如果您在隐藏第一个进度条对象之前创建另一个进度条对象,那么第二个进度条将在 hide() 中崩溃。

    if(_progressBar == null)
        _progressBar = new ProgressDialog(this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2013-12-24
      相关资源
      最近更新 更多