-1

私はアンドロイド ニュース リーダー アプリを開発しています。インスタンスを保存できるように、Serializable を実装する AsyncTask があります。電話を回転させるときにアプリの更新を処理するために使用します。アプリをローテーションすると、タスクがまだ実行されています。しかし、タスクの実行中にホームボタン/戻るボタンを押してアプリを閉じると、アプリが強制的に閉じられます。私のコードに何か問題がありますか?

@Override
protected void onSaveInstanceState(final Bundle outState) {
    // super.onSaveInstanceState(outState);
    outState.putInt("curPage", mPager.getCurrentItem());
    outState.putInt("drawerPos", drawerPos);
    outState.putSerializable("task", task);
    if (dialog != null) {
        outState.putBoolean("isDialogShowing", dialog.isShowing());
    } else {
        outState.putBoolean("isDialogShowing", false);
    }
    // outState.putSerializable("dialog", dialog);
}

// dismiss dialog if activity is destroyed
@Override
protected void onDestroy() {
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
        dialog = null;
    }
    if (task.getStatus() == AsyncTask.Status.RUNNING)
        task.cancel(true);
    task = null;
    super.onDestroy();
}

MyAsyncTask:

public class AsyncTaskRefreshRss extends
    AsyncTask<String, String, ArrayList<BeritaHeader>> implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 3385729493967673390L;

private OnResponseListener responder;

// MyAlertDialogFragment myDialog;
ProgressDialog dialog;
FragmentManager fm;
Context context;
String type;
String subtype;

public AsyncTaskRefreshRss(Context context, FragmentManager fm,
        String type, String subtype, OnResponseListener listener) {
    this.fm = fm;
    this.context = context;
    this.type = type;
    this.subtype = subtype;
    this.responder = listener;
}

public void setFinishListener(OnResponseListener listener){
    this.responder = listener;
}

public void setDialog(ProgressDialog dialog) {
    this.dialog = dialog;
}

@Override
protected void onPreExecute() {
    dialog.show();
}

@Override
protected ArrayList<BeritaHeader> doInBackground(String... arg0) {
    MyWebService ws = new MyWebService();
    try {
        return ws.GetRSS(type, subtype);
    } catch (Exception e) {
        return null;
    }

}

public interface OnResponseListener {
    public void onSuccess();

    public void onFailure();
}

@Override
protected void onPostExecute(ArrayList<BeritaHeader> result) {
    if (dialog.isShowing())
        dialog.dismiss();
    if (result != null) {
        NewsDataSource ds = new NewsDataSource(context);
        ds.deleteAllBerita(type, subtype);
        ds.createBerita(result, type, subtype);
        responder.onSuccess();
    } else {
        Toast toast = Toast.makeText(context, "Gagal memuat",
                Toast.LENGTH_LONG);
        toast.show();
        responder.onFailure();
    }
    // asyncState = DO_NOTHING;
}

public static class MyAlertDialogFragment extends DialogFragment {

    public boolean isCanceled;

    public static MyAlertDialogFragment newInstance() {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        return frag;
    }

    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final ProgressDialog dialog = new ProgressDialog(getActivity());
        dialog.setMessage("Sedang Memuat");
        dialog.setIndeterminate(false);
        dialog.setCancelable(false);
        dialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                // TODO Auto-generated method stub
                isCanceled = true;
            }
        });
        isCanceled = false;
        return dialog;
    }

}
}

私のlogcat:

07-19 19:37:00.905: E/AndroidRuntime(29243): FATAL EXCEPTION: main
07-19 19:37:00.905: E/AndroidRuntime(29243): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.karyadigital.beritaku.berita.AsyncTaskRefreshRss)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Parcel.writeSerializable(Parcel.java:1279)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Parcel.writeValue(Parcel.java:1233)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Parcel.writeMapInternal(Parcel.java:591)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Bundle.writeToParcel(Bundle.java:1619)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Parcel.writeBundle(Parcel.java:605)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2247)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2915)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Handler.handleCallback(Handler.java:615)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Looper.loop(Looper.java:137)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.app.ActivityThread.main(ActivityThread.java:4898)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.lang.reflect.Method.invokeNative(Native Method)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.lang.reflect.Method.invoke(Method.java:511)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at dalvik.system.NativeStart.main(Native Method)
07-19 19:37:00.905: E/AndroidRuntime(29243): Caused by: java.io.NotSerializableException: android.app.Application
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
07-19 19:37:00.905: E/AndroidRuntime(29243):    at android.os.Parcel.writeSerializable(Parcel.java:1274)
07-19 19:37:00.905: E/AndroidRuntime(29243):    ... 15 more
4

2 に答える 2

2

AsyncTaskSerializable を作成してシリアル化することはできません。理由: システムがすべてのフィールドをシリアル化しようとするため、作成できません。各フィールドのフィールドについても同様です。また、フィールドがシリアライズ可能ではなく、 でマークされていないtransient場合は、上記の例外が発生します。

AsyncTaskアクティビティが再作成されたときに をアクティビティから切り離したい場合は、フラグメントで構成の変更を使用します。のやり方を解説した記事です

于 2013-07-19T11:52:23.403 に答える