2011-10-21 40 views
0

這是我有一個加載頁面的選項卡。Android progressBar隨機崩潰與nullPointerException,無法理解爲什麼

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

在一段時間後會就行了progressBar.hide()onPageFinished()下一個NullPointerException崩潰。這沒有任何意義,因爲onPageStarted()啓動progressBar,onPageStarted總是在onPageFinished()之前。爲什麼是這樣?

這種情況只發生在10次之內,這對我來說真是令人困惑。

當活動第一次開始時,通常會發生(總是?)。

回答

4

試試這個

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

這就是我最終做的,但你知道這是爲什麼嗎? – Gibson

+0

我不能確定沒有調試你可以在onPageStarted,onPageFinished和onCreate上放置斷點看看會發生什麼 –

0

也許活動已在兩個回調之間重新啓動?顯示progressBar時,嘗試旋轉手機以查看結果。

+0

當我這樣做時,它只是回到無論它試圖加載之前。雖然progressBar甚至沒有顯示,但它崩潰了。 – Gibson

0

嘗試加載進度條作爲單獨的對象。如果您在隱藏第一個進度條對象之前創建另一個進度條對象,則第二個進度條會在hide()中崩潰。

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