Проблема: передача больших данных во вторую активность

У меня странная проблема. Я смотрел по Сети, но не нашел ответа. Я все еще новичок в программировании для Android. Итак отпустите:

Все, что я хочу сделать, это вызов второго действия с некоторыми данными. Он отлично работает с небольшими данными, но если данные становятся большими, вторая активность не будет отображаться, а первая будет завершена. Здесь мой код вызывающего метода:

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. Приложение работает как charme с пряниками и froyo.

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

Ответ 1

Вероятно, вы получаете TransactionTooLargeException

Как было предложено google андроидом, вы можете использовать статические поля или одиночные списки для обмена данными между действиями.

Они рекомендуют его "Для совместного использования сложных ненастроенных пользовательских объектов на короткий срок"

Из вашего кода кажется, что именно то, что вам нужно.

Итак, ваш код в ActivitySearch.class может выглядеть примерно так:

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

Затем вы можете получить доступ к ActivityResults.data из любой точки активности ActivityResults после ее запуска.

Для данных, которые необходимо использовать для сеансов пользователей, не рекомендуется использовать статические поля, так как процесс приложения может быть убит и перезапущен платформой Android, когда приложение работает в фоновом режиме (если фрейму необходимо освободить ресурсы). В этом случае все статические поля будут повторно инициализированы.

Ответ 2

То, как я предпочитаю передавать большие данные, - это использование перечислений. Некоторые преимущества этого подхода:

  • Не нужно создавать одиночные списки, у вас всегда есть один экземпляр вашего перечисления;
  • Данные правильно инкапсулированы;
  • Ссылка удаляется сразу после ее получения.

Вот пример:

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);
    }
}

Подробнее здесь.

Ответ 3

Если вы передаете большую информацию от одной к другой активности, возможно, это сделает приложение медленнее

но используйте Global Class для хранения переменных с использованием, которые вы можете легко получить или установить любые значения

объявленный в глобальном файле

см. эту ссылку:

http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

Ответ 4

Насколько я помню, вплоть до API-8 (Froyo), были некоторые ограничения (например, 1 МБ) при прохождении простых объектов по намерениям. Однако вы можете просто записать свои подробные данные в файл и отправить путь к следующему действию с помощью пакета. Позже, код второго действия, чтобы читать данные из файла и удалить его впоследствии.

Ответ 5

Я понятия не имею, почему он не работает с большими данными, но если вы не нашли способ его исправить, я предлагаю вам использовать настраиваемое глобальное приложение как здесь. (Также проверьте правильный ответ, чтобы он работал)