【问题标题】:NullPointerException when cancel progressDialog to go back another activity取消 progressDialog 以返回另一个活动时出现 NullPointerException
【发布时间】:2011-10-28 06:05:14
【问题描述】:

有人知道这里发生了什么吗?有什么方法可以让用户取消 progressDialog 并返回到 Activity A 而不会发生任何崩溃?

重现此崩溃的步骤:

activity A 中,我启动了一个新意图 Activity B tabhost,在 progressDialog 加载完成之前加载“class1.java”(带有 progressDialog 的 Webview),我很快点击后退按钮返回 Activity A 我遇到了崩溃

如果出现以下情况,应用不会崩溃:

  • 我等到 webview 加载完成并返回 Activity A

  • 我取消了 progressDialog 并停留在 webview 上,直到页面加载完成并返回到 Activity A

第 51 行: progressDialog.incrementProgressBy(progress);

Logcat: http://pastebin.com/uBw4xcaY

java.lang.NullPointerException
at com.domain.package.ui.class1$class1_$1.onProgressChanged(class1.java:51)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:358)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)

这是我的代码:

[...]

public class class1 extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_stack);

}

public static class class1_ extends Fragment {

    /** The Fragment's UI **/
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.class_, container, false);

        WebView engine = (WebView) v.findViewById(R.id.web_engine);

        final ProgressDialog progressDialog;
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(true);
        progressDialog.setProgress(0);
        progressDialog.show();

        engine.setWebChromeClient(new WebChromeClient() {

            public void onProgressChanged(WebView view, int progress) {

                progressDialog.setProgress(0);
                getActivity().setProgress(progress * 1000);

                progressDialog.incrementProgressBy(progress);

                if (progress == 100 && progressDialog.isShowing())
                    progressDialog.dismiss();
            }

        });

            engine.getSettings().setBuiltInZoomControls(false);
            engine.getSettings().setUseWideViewPort(false);
            engine.getSettings().setSupportZoom(false);
            engine.loadUrl("file:///android_asset/index.html");


        Toast.makeText(getActivity(),
                "Hello this is a toast",
                Toast.LENGTH_LONG).show();

        return v;
    }
  }
}

【问题讨论】:

标签: java android progressdialog


【解决方案1】:

尝试像这样更改您的 onChanged() 方法:

public void onProgressChanged(WebView view, int progress) {
  if( progressDialog.isShowing() ) {
    progressDialog.setProgress(0);
    getActivity().setProgress(progress * 1000);

    progressDialog.incrementProgressBy(progress);

    if ( progress == 100 )
      progressDialog.dismiss();
  }
}

然后将这个添加到片段onPause()方法中:

if( progressDialog != null && progressDialog.isShowing() )
  dialog.dismiss();

【讨论】:

  • 感谢问题已解决;如果我不将您提供的代码包含在 onPause() 中会发生什么?
  • 也许不需要 - 但您可能最终会在方向更改或点击后退按钮时泄漏对话框(将显示在您的 logcat 中)。
【解决方案2】:

当您取消 Dialog 并返回时,Dialog 设置为 null,但您的 WebChromeClient 回调仍在加载,当进度更改时,进度设置为 Dialog,但 @987654326 @ 是 null 所以导致 NullPointerException。将您的setWebChromeClient() 修改为。

engine.setWebChromeClient(new WebChromeClient() {
      public void onProgressChanged(WebView view, int progress) {
            if(progressDialog != null)
                progressDialog.setProgress(0);
                getActivity().setProgress(progress * 1000);
                progressDialog.incrementProgressBy(progress);
                if (progress == 100 && progressDialog.isShowing())
                    progressDialog.dismiss();
            }
      }
});

【讨论】:

  • 感谢您的帮助和解释,可惜stackoverflow不允许选择2个答案;无论如何,如果你愿意,我会将你的名字包含在我的应用信用列表中:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多