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

У меня странная проблема. Я смотрел по Сети, но не нашел ответа. Я все еще новичок в программировании для 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 

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

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

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

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

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

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

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

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

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

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

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

Вот пример:

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

Больше информации здесь .

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

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

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

См. Эту ссылку:

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

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

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