【问题标题】:Intent extras null on configuration changeIntent extras 在配置更改时为空
【发布时间】:2016-08-04 02:05:36
【问题描述】:

我创建了一个显示在SurfaceView 上的布局,我可以使用Bundle extras = getIntent().getExtras() 获得setDataSource

在我尝试从 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",因为我试图使布局具有不同的高度/宽度值

编辑

感谢 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);

【问题讨论】:

标签: android android-intent nullpointerexception bundle extras


【解决方案1】:

从中获取值

Bundle extras = getIntent().getExtras();

并非总是如此 - 如果 savedInstanceState 不为 null,则 newStringsavedInstanceState.getSerializable("urlAddress"); 的值,它可能返回 null。

或者,getIntent().getExtras() 为空,因此您点击

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

这肯定会导致错误。

在任何一种情况下,您都可以使用 this 来捕获错误

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

然后,为了解决这个问题,您可能必须实现 onSaveInstanceState 以将 url 字符串放入该 savedInstanceState Bundle。但是,您应该使用putStringgetString,而不是put / get - Serializable。这样你就可以避免演员表了。

为了找到变量在哪里变空,只需适当地记录和调试即可。

在方向更改之间保存数据的方法可以在Handling Runtime Changes找到

【讨论】:

  • 感谢您的回复,我尝试将newString = null; 更改为newString = ""; 仍然遇到同样的错误。我已经更新了我的问题
  • @FayZan 查看我的更新。记下// Code that requires urlString 的评论
  • 谢谢,直到您添加了playAll(),我才明白这意味着什么。将与您一起更新我的进度
【解决方案2】:

所以我决定手动制作

我用

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

这将在不破坏活动的情况下使高度/宽度值不同

【讨论】:

  • XML 内容视图自动切换。这如何修复 Bundle 中的 NullPointerException?
  • @cricket_007 我将此命令 android:configChanges="orientation|screenSize|keyboardHidden" 输入到我的 AndroidManifest.xml 中,因此它不会在定向时崩溃。另外,当使用 android:configChanges="orientation" 时,我的活动在横向运行时不会被破坏,这可能解释了为什么我的Bundle extras = getIntent().getExtras(); 首先是空的。如果我没记错的话 Bundle extra 是临时的,所以在销毁时它会变成空
  • @cricket_007 我不是真的 100% 确定这就是原因,因为我在另一个代码中遇到了类似的问题,我在这里发布了一个问题 stackoverflow.com/questions/2605470/…
  • 该链接不是您发布的问题
  • @cricket_007 哎呀,我很抱歉stackoverflow.com/questions/38763116/… 已经修复了它,但如果你有更好的方法,我很乐意尝试
猜你喜欢
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多