Случайный сбой Android ProgressBar с nullPointerException, не могу понять, почему - PullRequest
0 голосов
/ 21 октября 2011

Вот одна из моих вкладок, которая загружает страницу.

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

Время от времени происходит сбой с исключением nullPointerException в строке progressBar.hide () в onPageFinished ().Это не имеет никакого смысла, так как onPageStarted () запускает progressBar, а onPageStarted всегда предшествует onPageFinished ().Почему это так?

Это происходит только раз в 10 раз или что-то, что меня действительно смущает.

Обычно это происходит (всегда?), Когда начинается действие дляпервый раз.

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

попробуйте

if(progressBar!=null)
       progressBar.hide();
0 голосов
/ 24 октября 2013

Попробуйте загрузить индикатор выполнения как одноэлементный объект.Если вы создадите другой объект индикатора выполнения перед тем, как спрятать первый, тогда второй индикатор выполнения вылетит в hide ().

if(_progressBar == null)
    _progressBar = new ProgressDialog(this);
0 голосов
/ 22 октября 2011

Может быть, действие было перезапущено между двумя обратными вызовами?Попробуйте повернуть телефон, пока отображается индикатор выполнения, чтобы увидеть результаты.

...