6

時々、私が本当に理解していない例外を目にします。これが私がすることです:私はインターフェースを持っています

public interface IResultProcessor<T> extends Serializable {

    void processResult(T result);

}

、このクラスで使用するインスタンス:

public class ConfirmationDialogFragment extends DialogFragment {

    public static void executeAfterConfirmation(FragmentActivity activity, IResultProcessor<Void> runnable,
        String title, String message, int icon, String positiveButtonText, String negativeButtonText) {

        ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();
        Bundle args = new Bundle();
        args.putSerializable(ARG_RUNNABLE, runnable);
        fragment.setArguments(args);
        fragment.show(activity.getSupportFragmentManager(), "dialog");
    }

}

このonCreateDialog()メソッドでは、インスタンスを受け取り、IProcessResultユーザーが確認した場合に実行します。

次に、これらすべてを次のようなアクティビティで使用します。

@SuppressWarnings("serial") 
IResultProcessor<Void> processor = new IResultProcessor<Void>() {

    @Override
    public void processResult(Void result) {
        new AsyncTask<Void, Void, String>() {

            @Override
            protected String doInBackground(Void... params) {
                DBFacade.INSTANCE.saveSession(session);
                return "My msg...";
            }

            @Override
            protected void onPostExecute(String result) {
                Toast.makeText(MyActivity.this, result, Toast.LENGTH_LONG).show();
            }

        }.execute((Void) null);
    }
};
ConfirmationDialogFragment.executeAfterConfirmation(this, processor, "Save session?", "dialog text", R.drawable.ic_dialog_info, "Save", "Don't save");

に保存されたsessionオブジェクトAsyncTaskは実装されておらずSerializable(ただしParcelable、他の理由により)、MyActivityのフィールドです。

そして、これが私が見ている例外です:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = MyActivity$3)
    at android.os.Parcel.writeSerializable(Parcel.java:1279)
    at android.os.Parcel.writeValue(Parcel.java:1233)
    at android.os.Parcel.writeMapInternal(Parcel.java:591)
    at android.os.Bundle.writeToParcel(Bundle.java:1619)
    at android.os.Parcel.writeBundle(Parcel.java:605)
    at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132)
    at android.os.Parcel.writeTypedArray(Parcel.java:1102)
    at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:357)
    at android.os.Parcel.writeParcelable(Parcel.java:1254)
    at android.os.Parcel.writeValue(Parcel.java:1173)
    at android.os.Parcel.writeMapInternal(Parcel.java:591)
    at android.os.Bundle.writeToParcel(Bundle.java:1619)
    at android.os.Parcel.writeBundle(Parcel.java:605)
    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2078)
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2874)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.io.NotSerializableException: MyActivity
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
    at android.os.Parcel.writeSerializable(Parcel.java:1274)
    ... 23 more
java.io.NotSerializableException: MyActivity
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
    at android.os.Parcel.writeSerializable(Parcel.java:1274)
    at android.os.Parcel.writeValue(Parcel.java:1233)
    at android.os.Parcel.writeMapInternal(Parcel.java:591)
    at android.os.Bundle.writeToParcel(Bundle.java:1619)
    at android.os.Parcel.writeBundle(Parcel.java:605)
    at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132)
    at android.os.Parcel.writeTypedArray(Parcel.java:1102)
    at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:357)
    at android.os.Parcel.writeParcelable(Parcel.java:1254)
    at android.os.Parcel.writeValue(Parcel.java:1173)
    at android.os.Parcel.writeMapInternal(Parcel.java:591)
    at android.os.Bundle.writeToParcel(Bundle.java:1619)
    at android.os.Parcel.writeBundle(Parcel.java:605)
    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2078)
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2874)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

ここで何が起こっているのか分かりますか?

4

1 に答える 1

3

私は完全には理解していませんが、どうやら問題を解決したようです。別のアクティビティがフォアグラウンドに入ったためにアクティビティが破棄されたときに、例外がスローされました。匿名のIResultProcessorクラスをアクティビティの静的内部クラスに変換することで解決しました。

于 2012-11-01T19:52:47.527 に答える