Reputation: 75
I'm using webview in an android app and I'm trying to get it to start automatically on the second time the app is started after saving the settings. After setting breakpoints I was able to determine the app is crashing on line "mWebView.setWebChromeClient(new WebChromeClient()" in WebActivity. I get the error source not found in debugger.
WebActivity:
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");
}
});
}
}
Main activity:
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();
}
}
Here's the logcat errors I get when just running the app:
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
Upvotes: 1
Views: 2024
Reputation: 36449
For the sake of a more complete answer:
The line that the NullPointerException
occurred on is 58, which happens to be
mWebView.loadUrl("http://"(b.getString("iptextfield")) + "/index.html");
At first glance, mWebView
, b.getString()
or b could be null
.
mWebView
was already used before without issue so it shouldn't be null
.
The String returned by b.getString()
is concatenated with two other strings, so that won't throw an NPE.
So that leaves b
itself.
This should make sense as in MainActivity
, you are starting WebActivity
but not adding any extras to its Intent
.
Use Intent#putExtra()
to add extras to the intent, before starting the next Activity
.
Then, as @siik suggested, it is good practise to make sure your Bundle
is not null:
if (b != null){
mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
}
You could even go a little further and check to see if b actually contains the key you are looking for.
if (b != null && b.containsKey ("iptextfield")){
mWebView.loadUrl("http://" + (b.getString("iptextfield")) + "/index.html");
}
Upvotes: 1
Reputation: 60224
You need to check if Bundle b = getIntent().getExtras();
Returns any value, i.e.not null
Upvotes: 0