2

Ich erstellte ein Layout, das auf einem SurfaceView angezeigt wird, und ich kann setDataSource mit Bundle extras = getIntent().getExtras() erhalten.Intent Extras Null bei Konfigurationsänderung

Alles funktioniert gut, bis ich versuche, das Landschaftslayout von land\layout.xml einzustellen.

My logcat ist

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference 
at asia.sumikawa.cybereyeview.liveActivity.onCreate(liveActivity.java:65) 
at android.app.Activity.performCreate(Activity.java:6092) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2481) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2608)  
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4216)  
at android.app.ActivityThread.access$900(ActivityThread.java:178)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1476)  
at android.os.Handler.dispatchMessage(Handler.java:111)  
at android.os.Looper.loop(Looper.java:194)  
at android.app.ActivityThread.main(ActivityThread.java:5637)  
at java.lang.reflect.Method.invoke(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:372)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)  

My Java-Codierung

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
Log.i(TAG, "onCreate"); 
setContentView(R.layout.activity_live_alternate); 
//loadLibrary(); 
final String newString; 
if (savedInstanceState == null) { 
    Bundle extras = getIntent().getExtras(); 
    if(extras == null) { 
    newString = null; 
    } else { 
    newString = extras.getString("urlAddress"); 
    } 
} else { 
    newString = (String) savedInstanceState.getSerializable("urlAddress"); 
} 
urlLink = "rtsp://" + newString.trim().substring(2); 
urlString = newString; 

die Null-Zeiger Ausnahme ist auf Linie

urlLink = "rtsp://" + newString.trim().substring(2);

, die den Wert von

bekommen

Bundle extras = getIntent().getExtras();

PS Ich würde nicht android:configChanges="orientation" verwenden lieber als ich das Layout zu machen bin versucht haben unterschiedliche Höhe/Breite Wert

EDIT

diese Code dank cricket_007 Nach der Zugabe von

if (newString != null){ 
    urlLink = "rtsp://" + newString.trim().substring(2); 
}else{ 
    Log.i(LOG,"Error"); 
} 

ich stattdessen diesen Fehler bekam

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'char java.lang.String.charAt(int)' on a null object reference 
at asia.sumikawa.cybereyeview.liveActivity.playAll(liveActivity.java:307) 
at asia.sumikawa.cybereyeview.liveActivity.onCreate(liveActivity.java:77) 

, die auf diesen Linien von Codes

void playAll(){ 
if(urlString.charAt(0) == '1'){ 
    videoPlay(); 
}else if(urlString.charAt(0) == '2'){ 
    videoPlay();videoPlay2(); 
}else if(urlString.charAt(0) == '3'){ 
    videoPlay();videoPlay2(); 
    videoPlay3(); 
}else if(urlString.charAt(0) == '4'){ 
    videoPlay();videoPlay2(); 
    videoPlay3();videoPlay4(); 
}} 

Nur falls dies erforderlich ist, das sind die Codes Ich verwende die String von der vorherigen Klasse übergeben

Intent i = new Intent(addressActivity.this, liveActivity.class); 
String strName = content.toString(); 
i.putExtra("urlAddress", strName); 
startActivity(i); 
+0

Bitte versuchen Sie diese [Lösung] (http://stackoverflow.com/questions/4096169/onsaveinstancestate-and-onrestoreinstancestate) – LvN

Antwort

1

, die von

den Wert bekommt
Bundle extras = getIntent().getExtras(); 

Nicht immer - wenn savedInstanceState nicht null ist, dann newString ist der Wert von savedInstanceState.getSerializable("urlAddress");, die möglicherweise null zurückkehren können.

Alternativ ist getIntent().getExtras() null, deshalb schlagen Sie

if (extras == null) { 
    newString = null; 
} 

die auf jeden Fall einen Fehler verursachen wird.

In jedem Fall Sie den Fehler fangen kann dies durch Verwendung

if (newString != null) { 
    urlString = "rtsp://" + newString.trim().substring(2); 
    // Code that requires urlString 
    playAll(); 
} else { 
    // Show an error 
} 

Und dann das Problem zu lösen, könnten Sie onSaveInstanceState implementieren müssen, um die URL-Zeichenfolge in das savedInstanceState Bundle zu setzen.Aber Sie sollten putString und getString, wahrscheinlich statt put/get - Serializable verwenden. Auf diese Weise vermeidest du die Besetzung.

Um herauszufinden, wo die Variable null ist, ist es nur eine Frage der Protokollierung und des Debuggens.

Approaches Ihre Daten zwischen Orientierungsänderungen Einsparung kann bei Handling Runtime Changes

+0

danke für die Antwort machen, ich versucht, 'newString = null;' in 'newString =" "zu ändern;' Ich bekomme immer noch den gleichen Fehler.Ich habe meine Frage aktualisiert –

+0

@FayZan Siehe mein Update. Notieren Sie sich den Kommentar, der sagt '// Code, der urlString erfordert –

+0

Danke, ich habe nicht verstanden, was das bedeutete, bis Sie' playAll() 'hinzugefügt haben.Wird meinen Fortschritt mit Ihnen aktualisieren –

-1

finden So entschied ich es manuell

Ich benutze

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 

// Checks the orientation of the screen 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 

    setContentView(R.layout.activity_live_alternate_land); 

} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 

    setContentView(R.layout.activity_live_alternate); 
} 

mit dieser Einstellung auf AndroidManifest.xml

zu machen android:configChanges="orientation"

Dies wird die Höhe/Breite-Wert verschieden, ohne die Aktivität zu zerstören

+0

Die XML-Inhaltsansicht wechselt automatisch. Wie behebt das die NullPointerException im Bundle? –

+0

@ cricket_007 Ich gebe diesen Befehl 'android: configChanges =" orientation | screenSize | keyboardHidden "' in meine AndroidManifest.xml ein, damit es bei der Ausrichtung nicht abstürzt.Plus bei der Verwendung von 'android: configChanges =" orientation "' meine Aktivität hat gewonnen ' Ich werde zerstört, wenn es in die Landschaft geht, was erklären kann, warum meine 'Bündel-Extras = getIntent(). getExtras(); 'ist null an erster Stelle. Wenn ich mich richtig erinnere, ist Bündel extra temporär, also wird es leer –

+0

@ cricket_007 Ich bin nicht wirklich 100% sicher, dass das der Grund ist, obwohl ich ein ähnliches Problem mit einem anderen Code habe, dem ich hier eine Frage gestellt habe http://stackoverflow.com/questions/2605470/displaying-the-time-in-am- pm-format-in-android –

Verwandte Themen