2016-08-04 29 views
2

Я создал макет, который отображается на SurfaceView, и я могу получить setDataSource с помощью Bundle extras = getIntent().getExtras().Intent extras null при изменении конфигурации

Все работает нормально, пока я не попытаюсь установить макет ландшафта от land\layout.xml.

Мой LogCat является

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)  

Мой Java кодирования

@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; 

Нулевая исключение указатель на линии

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

который получает значение

Bundle extras = getIntent().getExtras();

PS Я предпочел бы не использовать android:configChanges="orientation" как я пытаюсь сделать макет имеют различную высоту/значение ширины

EDIT

После добавления этих кодов благодаря cricket_007

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

Я получил эту ошибку вместо

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) 

, которые указывают на эти строки кодов

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

Только в случае, если это необходимо, эти коды я использую, чтобы передать String от предыдущего класса

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

Пожалуйста, попробуйте это [решение] (http://stackoverflow.com/questions/4096169/onsaveinstancestate-and-onrestoreinstancestate) – LvN

ответ

1

который получает значение

Bundle extras = getIntent().getExtras(); 

Не всегда - если savedInstanceState не равно нулю, то newString это значение savedInstanceState.getSerializable("urlAddress");, которые могли бы вернуть нуль.

В качестве альтернативы, getIntent().getExtras() пустой, поэтому вы попали

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

Что, безусловно, вызовет ошибку.

В любом случае, вы можете поймать ошибку с помощью этого

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

И тогда для решения этой проблемы, возможно, придется реализовать onSaveInstanceState поставить строку URL-адрес в этом savedInstanceState Bundle.Но, вы должны использовать putString и getString, возможно, вместо put/get - Serializable. Таким образом, вы избегаете приведения.

Чтобы найти, где переменная получает значение null, это просто вопрос ведения журнала и отладки.

подходы к сохранению данных между изменениями ориентации могут быть найдены в Handling Runtime Changes

+0

спасибо за ответ, я попробовал изменить 'newString = null;' на 'newString =" ";' Я все равно получаю ту же ошибку. Я обновил свой вопрос –

+0

@FayZan См. мое обновление. Обратите внимание на комментарий, в котором говорится: // Код, требующий urlString –

+0

Спасибо, я не понял, что это значит, пока вы не добавили 'playAll()'. Будем обновлять свой прогресс с вами –

-1

Так что я решил сделать это вручную

Я использую

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

с этой установкой на AndroidManifest.xml

android:configChanges="orientation"

Это позволит сделать высота/ширина значение, отличное, не разрушая активности

+0

Просмотр содержимого XML автоматически переключается. Как это исправить исключение NullPointerException в Bundle? –

+0

@ cricket_007 Я ввожу эту команду 'android: configChanges =" ориентация | screenSize | keyboardHidden "' в мой AndroidManifest.xml, чтобы она не разбивалась при ориентации. Плюс при использовании 'android: configChanges =" orientation "' моя активность выиграла ' t быть уничтоженным, когда он идет пейзаж, который может объяснить, почему мой 'Bundle extras = getIntent(). getExtras();' вначале является нулевым. Если я правильно помню, Bundle extra является временным, поэтому после его уничтожения он становится пустым –

+0

@ cricket_007 Я на самом деле не уверен на 100%, потому что это связано с тем, что у меня возникла аналогичная проблема с другим кодом, в котором я поставил вопрос здесь http://stackoverflow.com/questions/2605470/displaying-the-time-in-am- pm-format-in-android –