【问题标题】:Webview crashing android app on startupWebview 在启动时崩溃 android 应用程序
【发布时间】:2013-08-19 19:39:29
【问题描述】:

我在一个 android 应用程序中使用 webview,我试图让它在保存设置后第二次启动应用程序时自动启动。设置断点后,我能够确定应用程序在 WebActivity 中的“mWebView.setWebChromeClient(new WebChromeClient()”行上崩溃了。我在调试器中找不到错误源。

网络活动:

public class WebActivity extends Activity 
{

WebView mWebView;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    final Activity mActivity = this;

    // Adds Progress bar Support
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.activity_web);


    // Makes Progress bar Visible
    getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);

    mWebView = (WebView) findViewById( R.id.webview );

    mWebView.getSettings().setBuiltInZoomControls(true);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);

    mWebView.setWebViewClient(new WebViewClient());
    mWebView.setWebChromeClient(new WebChromeClient() 
    {
        public void onProgressChanged(WebView view, int progress)  
        {
            //Make the bar disappear after URL is loaded, and changes string to Loading...
            findViewById(R.id.webview).setVisibility(View.GONE);
            mActivity.setTitle("Loading...");
            mActivity.setProgress(progress * 100); //Make the bar disappear after URL is loaded

            // Return the app name after finish loading
            if(progress == 100)
            {
                mActivity.setTitle(R.string.webtitle);
                findViewById(R.id.webview).setVisibility(View.VISIBLE);
            }
        }
    });
    Bundle b = getIntent().getExtras();
    mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
    WebView wv = (WebView) findViewById(R.id.webview);
    wv.setWebViewClient(new WebViewClient() 
    {
    boolean toast_f = true;
       @Override
       public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
       {
           Context context = getApplicationContext();
           CharSequence text = "Loading...(this may take up to 60 seconds)";

           if (toast_f)
           {
               toast_f = false;
               int duration = Toast.LENGTH_LONG;
               Toast toast = Toast.makeText(context, text, duration);
               toast.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);
               toast.show();
           }

           Bundle b = getIntent().getExtras();
           mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
       }
    });
}

}

主要活动:

public class MainActivity extends Activity 
{

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    Intent intent;

    SharedPreferences sharedPref= getSharedPreferences("mypref", 0);
    String GetStatus = sharedPref.getString("DataSaved", "");

    if (GetStatus.equals("true")) 
    {
       intent = new Intent(this, WebActivity.class);
    } 
    else 
    {
       intent = new Intent(this, SetupActivity.class);
    }

    startActivity(intent);
    finish();
}

}

这是我在运行应用程序时遇到的 logcat 错误:

08-19 12:25:54.407: W/dalvikvm(15158): threadid=1: thread exiting with uncaught      exception (group=0x4202d438)
08-19 12:25:54.407: E/AndroidRuntime(15158): FATAL EXCEPTION: main
08-19 12:25:54.407: E/AndroidRuntime(15158): java.lang.RuntimeException: Unable to  start activity ComponentInfo{com.webpage.WebActivity}: java.lang.NullPointerException
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2098)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread.access$600(ActivityThread.java:138)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.os.Looper.loop(Looper.java:137)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread.main(ActivityThread.java:4911)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at java.lang.reflect.Method.invokeNative(Native Method)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at java.lang.reflect.Method.invoke(Method.java:511)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at dalvik.system.NativeStart.main(Native Method)
08-19 12:25:54.407: E/AndroidRuntime(15158): Caused by: java.lang.NullPointerException
08-19 12:25:54.407: E/AndroidRuntime(15158):    at com.webpage.WebActivity.onCreate(WebActivity.java:58)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.Activity.performCreate(Activity.java:5240)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
08-19 12:25:54.407: E/AndroidRuntime(15158):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2037)
08-19 12:25:54.407: E/AndroidRuntime(15158):    ... 11 more

【问题讨论】:

  • 异常其实是NullPointerExceptionWebActivity.java58 行是什么?
  • @A--C 第 58 行是 mWebView.loadUrl("http://"(b.getString("iptextfield")) + "/index.html");我没有在 sharedpreferences 中保存 iptextfield 的信息,这可能是问题吗?
  • 是的,这就是问题所在。如果您请求的值不存在,getString 将返回 null。非常规命名的 GetStatus 变量也存在为空的风险。
  • @323go 但是,null 字符串与其他两个字符串连接。 Bundle b 很可能是 null
  • 好的,谢谢。我是开发 android 应用程序的新手,直到 A--C 指出第 58 行导致问题时,我才知道如何解释 logcat。我现在知道了。 @A--C 你能输入答案让我勾选吗?

标签: android webview


【解决方案1】:

为了更完整的答案:

NullPointerException 出现的行是 58,恰好是

mWebView.loadUrl("http://"(b.getString("iptextfield")) + "/index.html"); 

乍一看,mWebViewb.getString() 或 b 可能是 null

mWebView 之前已经使用过没有问题,所以它不应该是null

b.getString() 返回的字符串与其他两个字符串连接,因此不会抛出 NPE。

这样就剩下b 本身了。

这在MainActivity 中应该是有意义的,你开始WebActivity 但没有在其Intent 中添加任何额外内容。

在开始下一个Activity 之前,使用Intent#putExtra() 为意图添加额外内容。

然后,正如@siik 建议的那样,确保您的Bundle 不为空是一个好习惯:

if (b != null){
   mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
}

您甚至可以更进一步检查 b 是否确实包含您要查找的密钥。

if (b != null && b.containsKey ("iptextfield")){
      mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
}

【讨论】:

    【解决方案2】:

    你需要检查Bundle b = getIntent().getExtras(); 返回任何值,即不为空

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多