2017-04-12 31 views
0

所以我正在处理的应用程序遇到问题,应用程序在Android 7及更高版本上崩溃。从logcat中,这个错误似乎发生在我的parcelable类上。Android Parcelable readStringArray()java.lang.RuntimeException:Nougat上的数组长度不佳

这里就是崩溃发生(具有parcelable类)点:

public class LookupCriteriaBean implements Parcelable, Serializable { 
private String lookupCode; 
private String lookupField; 
private String lookupDisplayName; 
private String lookupSearchValue; 

public LookupCriteriaBean(){   
} 

public LookupCriteriaBean(String s) { 
    if (s == null || "".equals(s.trim())) 
throw new IllegalArgumentException("Invalid lookup criteria setting from server!"); 

    int idx = 0; 
    String[] arrS = Tool.split(s, Global.DELIMETER_DATA); 
    lookupCode = arrS[idx++]; 
    lookupField = arrS[idx++]; 
    lookupDisplayName = arrS[idx++]; 
} 

public LookupCriteriaBean(Parcel in) { 
    String[] arrS = new String[LookupCriteriaBean.class.getFields().length]; 
    in.readStringArray(arrS); 

    int idx = 0; 
    lookupCode = arrS[idx++]; 
    lookupField = arrS[idx++]; 
    lookupDisplayName = arrS[idx++]; 
} 

public String getLookupCode() { 
    return lookupCode; 
} 

public void setLookupCode(String lookupCode) { 
    this.lookupCode = lookupCode; 
} 

public String getLookupField() { 
    return lookupField; 
} 

public void setLookupField(String lookupField) { 
    this.lookupField = lookupField; 
} 

public String getLookupDisplayName() { 
    return lookupDisplayName; 
} 

public void setLookupDisplayName(String lookupDisplayName) { 
    this.lookupDisplayName = lookupDisplayName; 
} 

public String toString() { 
    return lookupDisplayName; 
} 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel dest, int flags) { 
    dest.writeStringArray(new String[] { lookupCode, lookupField, lookupDisplayName }); 
} 

public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() { 

    public LookupCriteriaBean createFromParcel(Parcel source) { 
     return new LookupCriteriaBean(source); 
    } 

    public LookupCriteriaBean[] newArray(int size) { 
     return new LookupCriteriaBean[size]; 
    } 
}; 

public String getLookupSearchValue() { 
    return lookupSearchValue; 
} 

public void setLookupSearchValue(String lookupSearchValue) { 
    this.lookupSearchValue = lookupSearchValue; 
    } 
} 

触发崩溃的线是in.readStringArray(arrS);

问题是崩溃只发生在Android上7和以上,它不会发生在我测试的任何其他设备上,我不知道是什么导致这种情况,因为应用程序运行良好,除了nougat设备以外的其他任何设备。

这里是logcat的输出:

E/AndroidRuntime(3868): FATAL EXCEPTION: main 

E/AndroidRuntime(3868): Process: com.adins.msmfif, PID: 3868 

E/AndroidRuntime(3868): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adins.msmfif/com.adins.msm.LookupActivity}: java.lang.RuntimeException: bad array lengths 

E/AndroidRuntime(3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 

E/AndroidRuntime(3868): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 

E/AndroidRuntime(3868): at android.app.ActivityThread.-wrap12(ActivityThread.java) 

E/AndroidRuntime(3868): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 

E/AndroidRuntime(3868): at android.os.Handler.dispatchMessage(Handler.java:102) 

E/AndroidRuntime(3868): at android.os.Looper.loop(Looper.java:154) 

E/AndroidRuntime(3868): at android.app.ActivityThread.main(ActivityThread.java:6077) 

E/AndroidRuntime(3868): at java.lang.reflect.Method.invoke(Native Method) 

E/AndroidRuntime(3868): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 

E/AndroidRuntime(3868): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

E/AndroidRuntime(3868): Caused by: java.lang.RuntimeException: bad array lengths 

E/AndroidRuntime(3868): at android.os.Parcel.readStringArray(Parcel.java:1125) 

E/AndroidRuntime(3868): at com.adins.msm.model.LookupCriteriaBean.<init>(LookupCriteriaBean.java:33) 

E/AndroidRuntime(3868): at com.adins.msm.model.LookupCriteriaBean$1.createFromParcel(LookupCriteriaBean.java:80) 

E/AndroidRuntime(3868): at com.adins.msm.model.LookupCriteriaBean$1.createFromParcel(LookupCriteriaBean.java:1) 

E/AndroidRuntime(3868): at android.os.Parcel.readParcelable(Parcel.java:2470) 

E/AndroidRuntime(3868): at android.os.Parcel.readValue(Parcel.java:2364) 

E/AndroidRuntime(3868): at android.os.Parcel.readListInternal(Parcel.java:2778) 

E/AndroidRuntime(3868): at android.os.Parcel.readArrayList(Parcel.java:2035) 

E/AndroidRuntime(3868): at android.os.Parcel.readValue(Parcel.java:2385) 

E/AndroidRuntime(3868): at android.os.Parcel.readArrayMapInternal(Parcel.java:2717) 

E/AndroidRuntime(3868): at android.os.BaseBundle.unparcel(BaseBundle.java:269) 

E/AndroidRuntime(3868): at android.os.Bundle.getParcelableArrayList(Bundle.java:886) 

E/AndroidRuntime(3868): at com.adins.msm.LookupActivity.initialize(LookupActivity.java:59) 

E/AndroidRuntime(3868): at com.adins.msm.LookupActivity.onCreate(LookupActivity.java:49) 

E/AndroidRuntime(3868): at android.app.Activity.performCreate(Activity.java:6662) 

E/AndroidRuntime(3868): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 

E/AndroidRuntime(3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 

任何帮助表示赞赏

下面是从我的活动代码具有触发错误

public class LookupActivity extends Activity implements OnClickListener { 
private ArrayAdapter<LookupCriteriaBean> listAdapter; 
private String lovType; 
public final LayoutParams defLayout = new LayoutParams(
     LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 

private QuestionBean bean = null; 
private LinearLayout questionContainer; 
private int totalCriteia = 1; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.lookup); 
    initialize(); 

    //---change to portrait mode--- 
//  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

private void initialize() { 
    setClickListener(); 

    Bundle extras = getIntent().getExtras(); 
    ArrayList<LookupCriteriaBean> list = extras.getParcelableArrayList(
      Global.BUND_KEY_LOV_CRITERIA); 
    listAdapter = new ArrayAdapter<LookupCriteriaBean>(this, 
      android.R.layout.simple_spinner_item, list); 
    listAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 


    bean = DynamicSurveyActivity.getQuestionInFocus(); 
    lovType = bean.getAnswerType(); 

    if(bean.getTextMaxLength()!=0){ 
     totalCriteia = bean.getTextMaxLength(); 
    } 
    questionContainer = (LinearLayout) findViewById(R.id.sub_search_bar); 
    questionContainer.setOrientation(LinearLayout.VERTICAL); 


    for (int i = 0; i < totalCriteia; i++) { 
     ViewGroup view = generateDropdownDesc(this,listAdapter, i); 
     questionContainer.addView(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);    
    } 
} 


private void setClickListener() { 
    Button btnSearch = (Button) findViewById(R.id.search_button); 
    btnSearch.setOnClickListener(this); 
} 

public void onClick(View v) {  
    Button btn = (Button) v; 
    int id = btn.getId(); 
    if (R.id.search_button == id) { 
     String lookupSearchValue = this.getSearchValue().trim(); 
    // if (this.validateSearchValue(lookupSearchValue)) { 

      LookupCriteriaBean lookupCriteriaBean[] = new LookupCriteriaBean[totalCriteia]; 

      for (int i = 0; i < totalCriteia; i++) { 

       LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i); 
       Spinner spinnerCriteria = (Spinner) qContainer.getChildAt(0); 
       int posSpinner = spinnerCriteria.getSelectedItemPosition(); 

       EditText editText = (EditText) qContainer.getChildAt(1); 

       LookupCriteriaBean beanCriteria = listAdapter.getItem(posSpinner); 
       beanCriteria.setLookupSearchValue(editText.getText().toString().trim()); 

       lookupCriteriaBean[i] = beanCriteria; 
      } 

      Map<String, Object> paramMap = new HashMap<String, Object>(); 
      paramMap.put(Global.MAP_KEY_LOOKUP_CRITERIA, mergeLookupCriteriaBean(lookupCriteriaBean)); 

      if (Global.AT_LOV.equals(lovType)) { 
       new LookupResultTask(this, getString(R.string.progressWait)) 
        .execute(paramMap); 
      } 
      else if (Global.AT_LOV_W_FILTER.equals(lovType)) { 
       LookupManager lookupManager = new LookupManager(); 
       QuestionBean qBean = DynamicSurveyActivity.getQuestionInFocus(); 
       List<QuestionBean> listOfQuestion = DynamicSurveyActivity.getListOfQuestion(); 

       lookupManager.setFilterValue(listOfQuestion, qBean); 

       paramMap.put(Global.MAP_KEY_LOOKUP_FILTER, qBean.getLovFilters()); 
       new LookupResultTask(this, getString(R.string.progressWait)) 
        .execute(); 
      } 
    // } 
    } 
} 


private String getSearchValue() { 
      String value = ""; 

    for (int i = 0; i < totalCriteia; i++) {   
     LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i);    
     EditText editText = (EditText) qContainer.getChildAt(1); 
     value = value+editText.getText().toString().trim(); 
    } 

    return value; 
} 

private boolean validateSearchValue(String searchValue) { 
    boolean valid = true; 

    List<String> errMessage = new ArrayList<String>(); 

    if ("".equals(searchValue)) { 
     errMessage.add(getString(R.string.lovHint) + " " + getString(R.string.msgRequired)); 
    } 

    if (errMessage.size() > 0) { 
     valid = false; 

     String[] msg = (String[]) errMessage.toArray(new String[errMessage.size()]); 
     String alert = Tool.implode(msg, "\n"); 
     Toast.makeText(this, alert, Toast.LENGTH_LONG).show(); 
    }  

    return valid; 
} 

public LinearLayout generateDropdownDesc(Activity activity, 
     ArrayAdapter<LookupCriteriaBean> listAdapter, int pos) { 
    LinearLayout container = new LinearLayout(activity); 
    container.setOrientation(LinearLayout.VERTICAL); 

    int totalOption = listAdapter.getCount(); 


     final String prompt = getString(R.string.lovCriteria); 
     Spinner spinner = new Spinner(activity); 
     EditText desc = new EditText(activity);  
     desc.setHint(string.lovHint); 
     spinner.setAdapter(listAdapter); 
     spinner.setPrompt(prompt); 

    if (pos < totalOption) { 
     spinner.setSelection(pos); 
    } else { 
     int tempPos = (pos%totalOption); 

     spinner.setSelection(tempPos); 
    } 


     container.addView(spinner, defLayout); 
     container.addView(desc, defLayout); 

    return container; 
} 

private LookupCriteriaBean mergeLookupCriteriaBean(LookupCriteriaBean[] lookupCriteriaBeanArray) { 
    LookupCriteriaBean lookupCriteriaBean = new LookupCriteriaBean(); 

    lookupCriteriaBean.setLookupCode(lookupCriteriaBeanArray[0].getLookupCode()); 
    lookupCriteriaBean.setLookupDisplayName(lookupCriteriaBeanArray[0].getLookupDisplayName()); 
    lookupCriteriaBean.setLookupField(lookupCriteriaBeanArray[0].getLookupField()); 
    lookupCriteriaBean.setLookupSearchValue(lookupCriteriaBeanArray[0].getLookupSearchValue()); 


    if (lookupCriteriaBeanArray.length > 1) { 
     for (int i = 1; i < lookupCriteriaBeanArray.length; i++) { 
      String code = lookupCriteriaBean.getLookupCode(); 
      String field = lookupCriteriaBean.getLookupField(); 
      String searchValue = lookupCriteriaBean.getLookupSearchValue(); 

      lookupCriteriaBean.setLookupCode(code 
        + Global.DELIMETER_SUBSUBDATA 
        + lookupCriteriaBeanArray[i].getLookupCode()); 
      lookupCriteriaBean.setLookupField(field 
        + Global.DELIMETER_SUBSUBDATA 
        + lookupCriteriaBeanArray[i].getLookupField()); 
      lookupCriteriaBean.setLookupSearchValue(searchValue 
        + Global.DELIMETER_SUBSUBDATA 
        + lookupCriteriaBeanArray[i].getLookupSearchValue()); 

     } 
    } 

    return lookupCriteriaBean; 

} 

按钮有R按钮.id.search_button按下时在android 7上崩溃崩溃

嗯。 ..所以我尝试了各种各样的事情,甚至重写代码,这个问题仍然存在,它可能是牛轧糖造成的这个,任何想法的东西?

+0

添加logtags你包裹前阵。检查它的长度,然后它被包裹 – Zoe

+0

看看[this](http://stackoverflow.com/questions/20829975/android-parcelable-bad-array-lengths) - 它是相同的问题,但如果您的问题仅在7.0以上触发,则可能有其他内容。但看看订单并添加调试标签! – Zoe

+0

['writeStringArray(new String [] {lookupCode,lookupField,lookupDisplayName})'数组的长度应该是3 ....并且您正在使用'LookupCriteriaBean.class.getFields()。length',它是4](https://github上。com/android/platform_frameworks_base/blob/master/core/java/android/os/Parcel.java#L1124) – Selvin

回答

-1

小提示!

您可以使用以下库来简化parcelable的使用。

https://github.com/codepath/android_guides/wiki/Using-Parceler

如果选中www.parcelabler.com,这可能是一个解决办法

public class LookupCriteriaBean implements Parcelable, Serializable { 
private String lookupCode; 
private String lookupField; 
private String lookupDisplayName; 
private String lookupSearchValue; 

public String getLookupSearchValue() { 
    return lookupSearchValue; 
} 

public void setLookupSearchValue(String lookupSearchValue) { 
    this.lookupSearchValue = lookupSearchValue; 
    } 

public String getLookupCode() { 
    return lookupCode; 
} 

public void setLookupCode(String lookupCode) { 
    this.lookupCode = lookupCode; 
} 

public String getLookupField() { 
    return lookupField; 
} 

public void setLookupField(String lookupField) { 
    this.lookupField = lookupField; 
} 

public String getLookupDisplayName() { 
    return lookupDisplayName; 
} 

public void setLookupDisplayName(String lookupDisplayName) { 
    this.lookupDisplayName = lookupDisplayName; 
} 

public String toString() { 
    return lookupDisplayName; 
} 

// 
// Here is the implementation of parcelable 
// 
    protected LookupCriteriaBean(Parcel in) { 
     lookupCode = in.readString(); 
     lookupField = in.readString(); 
     lookupDisplayName = in.readString(); 
     lookupSearchValue = in.readString(); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(lookupCode); 
     dest.writeString(lookupField); 
     dest.writeString(lookupDisplayName); 
     dest.writeString(lookupSearchValue); 
    } 

    @SuppressWarnings("unused") 
    public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() { 
     @Override 
     public LookupCriteriaBean createFromParcel(Parcel in) { 
      return new LookupCriteriaBean(in); 
     } 

     @Override 
     public LookupCriteriaBean[] newArray(int size) { 
      return new LookupCriteriaBean[size]; 
     } 
    }; 
} 
+0

注意:YOu不能声明两个具有相同名称的对象的实现,除非你添加它所嵌套的包/类(取决于它是否是独立类) – Zoe

0

重写我的代码几次广告引用同样的问题其他的答案,拆分后阵字符串我用来分开字符串修复这个问题,虽然我仍然不知道为什么getStringArray(arrS)只会崩溃在Android 7及以上。

我很想知道为什么我的代码仍然运行在较低的版本,但罚款。

所以两个分开的所有领域访问它们在正确的顺序,然后它的工作。

这里是我的固定码:

---------------snip--------------------------------- 

public LookupCriteriaBean(Parcel in) { 
    lookupCode = in.readString(); 
    lookupField = in.readString(); 
    lookupDisplayName = in.readString(); 
    } 

public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(lookupCode); 
    dest.writeString(lookupField); 
    dest.writeString(lookupDisplayName); 
} 

-----------------snip--------------------------------