Android api>=24 पर java.lang.IllegalArgumentException के साथ गतिविधि फिर से शुरू करने में असमर्थ




android-activity android-8.0-oreo (3)

निम्नलिखित स्टैकट्रेस के साथ संस्करण 7.0 , 7.1.1 और 8.0.0 चलाने वाले उपकरणों पर मेरे ऐप में एक दुर्घटना है:

Fatal Exception: java.lang.RuntimeException: Unable to resume activity {xxx/xxx.views.activities.HomeActivity}: java.lang.IllegalArgumentException
   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3788)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991)
   at android.app.ActivityThread.-wrap14(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6692)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Caused by java.lang.IllegalArgumentException
   at android.os.Parcel.readException(Parcel.java:1697)
   at android.os.Parcel.readException(Parcel.java:1646)
   at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:6600)
   at android.app.Activity.isTopOfTask(Activity.java:6142)
   at android.app.Activity.onResume(Activity.java:1331)
   at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:485)
   at xxx.views.activities.BaseActivity.onResume(BaseActivity.java:50)
   at xxx.views.activities.HomeActivity.onResume(HomeActivity.java:364)
   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277)
   at android.app.Activity.performResume(Activity.java:7058)
   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3765)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991)
   at android.app.ActivityThread.-wrap14(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6692)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

रिपोर्ट की गई लाइनों पर मेरा कोड बस है:

// HomeActivity class
@Override
public void onResume() {
    mPresenter.onResume();
    super.onResume();

    renderView();
}

// BaseActivity class
@Override
protected void onResume() {
    super.onResume();
    // some other code
}

मैंने इस बारे में कुछ खुदाई की और इसी तरह का question पाया।

चूंकि IllegalArgumentException में कोई डिटेल संदेश नहीं है, इसलिए मैं here सुझाव के अनुसार अतिरिक्त लॉग में डालने का प्रयास करने जा रहा हूं।

इस बीच किसी भी मदद की सराहना करते हैं!


समस्या आपको पार्सल के साथ है। आपको यह पता लगाने की आवश्यकता है कि गतिविधि, टुकड़ा, दृश्य राज्य को बचाने के लिए पार्सल को कैसे बचा रहा है। गलत क्रम होगा। जैसे

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    final CharSequence textFromEditText = mTextView.getText();
    if (textFromEditText != null) {
        SavedState savedState = new SavedState(superState);
        savedState.text = textFromEditText.toString();
        return savedState;
    }
    return superState;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (!(state instanceof SavedState)) {
        super.onRestoreInstanceState(state);
        return;
    }

    SavedState savedState = (SavedState) state;
    super.onRestoreInstanceState(savedState.getSuperState());
    if (!TextUtils.isEmpty(savedState.text)) {
        mTextView.setText(savedState.text);
    }
}

private static class SavedState extends BaseSavedState {
    String text;

    private SavedState(Parcelable superState) {
        super(superState);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(text);
    }

    private SavedState(Parcel source) {
        super(source);
        text = source.readString();
    }

    public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {

        @Override
        public SavedState createFromParcel(Parcel source) {
            return new SavedState(source);
        }

        @Override
        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}

इसलिए समस्या किसी दिन हो सकती है

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(text);
    }

    private SavedState(Parcel source) {
        super(source);
        text = source.readString();
    }

जब पार्सल स्रोत पढ़ने के अनुक्रम खराब हैं।


            catch (Exception e) {
                if (!mInstrumentation.onException(r.activity, e)) {
                    throw new RuntimeException(
                        "Unable to resume activity "
                        + r.intent.getComponent().toShortString()
                        + ": " + e.toString(), e);
                }
            }

यह एक जंजीर exeption है इसलिए e.getCause () स्टैकट्रेस -> का निरीक्षण करें क्योंकि तब तक अशक्त रहेगा

यदि आपको यह गतिविधि थ्रेड में विधि को देखने पर नहीं मिलेगा, जो ब्लॉक को आमंत्रित करता है:

try {
  r.activity.onStateNotSaved();
  r.activity.mFragments.noteStateNotSaved();

  if (r.pendingIntents != null) {
    deliverNewIntents(r, r.pendingIntents);
    r.pendingIntents = null;
  }

  if (r.pendingResults != null) {
    deliverResults(r, r.pendingResults);
    r.pendingResults = null;
  }

  r.activity.performResume();

  // If there is a pending local relaunch that was requested 
  // when the activity was
  // paused, it will put the activity into paused state
  // when it finally happens.
  // Since the activity resumed before being relaunched, 
  // we don't want that to happen,
  // so we need to clear the request to relaunch paused.

  for (int i = mRelaunchingActivities.size() - 1; i >= 0; i--) {
    final ActivityClientRecord relaunching =
    mRelaunchingActivities.get(i);

    if (relaunching.token == r.token
        && relaunching.onlyLocalRequest &&
        relaunching.startsNotResumed) {
            relaunching.startsNotResumed = false;
    }
 }
}

आपको इसमें कारण खोजने होंगे:

  • Activity.onStateNotSaved ();
  • Activity.mFragments.noteStateNotSaved ();
  • Activity.performResume ();
  • और अंतिम गतिविधि।
    Caused by java.lang.IllegalArgumentException
        at android.os.Parcel.readException(Parcel.java:1697)
        at android.os.Parcel.readException(Parcel.java:1646)
        at android.app.ActivityManagerProxy.isTopOfTask (ActivityManagerNative.java:6600)
        at android.app.Activity.isTopOfTask(Activity.java:6142)
        at android.app.Activity.onResume(Activity.java:1331)

और सबसे अच्छा शॉट यह इस मुद्दे के लिए एक जवाब है:

rjava.lang.IllegalArgumentException प्रारंभता पर (आशय, बंडल ऐनिमेशन)


मेरी परियोजना में भी यही मुद्दा था। शोध करते समय मैंने पाया कि यह संभव भी हो सकता है यदि आप अपनी गतिविधि के onResume() विधि से किसी static चर या विधियों तक पहुँचने का प्रयास कर रहे हैं।





android-7.0-nougat