44

奇妙な問題があります。私はウェブを見回していましたが、答えが見つかりませんでした。私はまだAndroidプログラミングの初心者です。じゃ、行こう:

私がやりたいことは、いくつかのデータを使用して 2 番目のアクティビティを呼び出すことだけです。小さなデータでは問題なく動作しますが、データが大きくなると、2 番目のアクティビティが表示されず、最初のアクティビティが終了します。呼び出しメソッドのコードは次のとおりです。

Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", searchList);
intent.putExtras(bundle);
startActivity(intent);

データを受信する部分は重要ではありません。バンドルを読み取ろうとしなくても、アクティビティは呼び出されません。これを次の行でテストしました。

@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("DEBUG","ActivityResult::onCreate()");
super.onCreate(savedInstanceState);

OnCreate()呼び出されることはありません。

たぶんあなたの誰かがアイデアを思いつきました... 助けてくれてありがとう!

編集:少なくとも私は忘れていました:これは ICS でのみ発生します。このアプリは、ジンジャーブレッドとフロヨのチャームのように機能します。

Edit2: Logcat

10-10 14:49:46.951: D/OpenGLRenderer(21696): Flushing caches (mode 0)
10-10 14:49:47.011: V/ActivityThread(22429): com.example.amazonsearch white listed for hwui
10-10 14:49:50.821: W/IInputConnectionWrapper(21696): showStatusIcon on inactive InputConnection
4

7 に答える 7

55

おそらくTransactionTooLargeExceptionを取得しています

google android guideで提案されているように、静的フィールドまたはシングルトンを使用してアクティビティ間でデータを共有できます。

彼らはそれを「複雑な非永続的なユーザー定義オブジェクトを短期間共有するため」に推奨しています

あなたのコードから、それはまさにあなたが必要としているもののようです。

したがって、ActivitySearch.class のコードは次のようになります。

ActivityResults.data = searchList;
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
startActivity(intent);

その後、ActivityResults アクティビティの開始後、どこからでも ActivityResults.data にアクセスできます。

ユーザー セッション間で共有する必要があるデータの場合、静的フィールドを使用することはお勧めできません。これは、アプリがバックグラウンドで実行されている間 (フレームワークがリソースを解放する必要がある場合)、Android フレームワークによってアプリケーション プロセスが強制終了され、再起動される可能性があるためです。このような場合、すべての静的フィールドが再初期化されます。

于 2012-10-11T20:43:03.210 に答える
33

大きなデータを渡す方法は、enumsを使用することです。このアプローチのいくつかの利点:

  • シングルトンを作成する必要はありません。列挙型のインスタンスは常に 1 つです。
  • データは適切にカプセル化されています。
  • 参照は、アクティビティが受信した直後に削除されます

以下に例を示します。

package com.jyvee.arguments;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class SomeActivity extends Activity {

    // Names for the arguments we pass to the
    // activity when we create it
    private final static String ARG_STRING = "ARG_STRING";
    private final static String ARG_INT = "ARG_INT";

    private String stringField;
    private int intField;
    private List<Object> arrayField;

    private enum DataHolder {
        INSTANCE;

        private List<Object> mObjectList;

        public static boolean hasData() {
            return INSTANCE.mObjectList != null;
        }

        public static void setData(final List<Object> objectList) {
            INSTANCE.mObjectList = objectList;
        }

        public static List<Object> getData() {
            final List<Object> retList = INSTANCE.mObjectList;
            INSTANCE.mObjectList = null;
            return retList;
        }
    }

    @Override
    protected void onCreate(final Bundle savedState) {
        super.onCreate(savedState);

        // Get the activity intent if there is a one
        final Intent intent = getIntent();

        // And retrieve arguments if there are any
        if (intent.hasExtra(ARG_STRING)) {
            stringField = intent.getExtras().getString(ARG_STRING);
        }
        if (intent.hasExtra(ARG_INT)) {
            intField = intent.getExtras().getInt(ARG_INT);
        }
        // And we retrieve large data from enum
        if (DataHolder.hasData()) {
            arrayField = DataHolder.getData();
        }

        // Now stringField, intField fields are available
        // within the class and can be accessed directly
    }

    /**
     * /** A static method for starting activity with supplied arguments
     * 
     * @param contextA
     *            context that starts this activity
     * @param stringArg
     *            A string argument to pass to the new activity
     * @param intArg
     *            An int argument to pass to the new activity
     * @param objectList
     *            An object list argument to pass to the new activity
     */
    public static void startActivity(final Context context, final String stringArg, 
            final int intArg, final List<Object> objectList) {

        // Initialize a new intent
        final Intent intent = new Intent(context, SomeActivity.class);

        // To speed things up :)
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

        // And add arguments to the Intent
        intent.putExtra(ARG_STRING, stringArg);
        intent.putExtra(ARG_INT, intArg);

        // Now we put the large data into our enum instead of using Intent extras
        DataHolder.setData(objectList);

        context.startActivity(intent);
    }
}

詳細はこちら

于 2013-02-05T11:27:39.317 に答える
3

私が覚えている限り、API-8 (Froyo) までは、パーセル可能なオブジェクトをインテント経由で渡すときにいくつかの制限 (1MB など) がありました。ただし、単純にパーセル可能なデータをファイルに書き留めて、そのファイル パスをバンドルを介して次のアクティビティに送信することもできます。後で、ファイルからデータを読み取り、後で削除するように 2 番目のアクティビティをコーディングします。

于 2012-10-10T12:50:29.557 に答える
3

ある情報から別の情報に大量の情報を渡すとActivity、アプリの速度が低下する可能性があります。

または、グローバル クラスを使用して変数を格納し、これを使用して任意の値を簡単に取得または設定できます。これは、グローバル ファイルで宣言できます。

このリンクを参照してください: http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

于 2012-10-10T12:49:57.460 に答える
1

大規模なデータで機能しない理由はわかりませんが、修正する方法が見つからない場合は、ここのようなカスタム グローバル アプリケーションを使用することをお勧めします。(それを機能させるために正しい答えもチェックしてください)

于 2012-10-10T12:53:32.950 に答える