首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >问题:将大型数据传递给第二个活动

问题:将大型数据传递给第二个活动
EN

Stack Overflow用户
提问于 2012-10-10 20:43:06
回答 7查看 34.3K关注 0票数 44

我有个奇怪的问题。我在网上转来转去,但没有找到答案。我还是一个android编程的初学者。所以让我们开始吧:

我想做的就是用一些数据调用第二个活动。它可以很好地处理小数据,但如果数据变大,第二个活动将不会显示,第一个活动将完成。下面是我的调用方法的代码:

代码语言:javascript
运行
复制
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", searchList);
intent.putExtras(bundle);
startActivity(intent);

接收数据的部分并不重要。即使我不尝试读取包,该活动也不会被调用。我已经用以下几行代码测试过了:

代码语言:javascript
运行
复制
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("DEBUG","ActivityResult::onCreate()");
super.onCreate(savedInstanceState);

OnCreate()从未被调用过。

也许你的其中一个人想到了..。谢谢你的帮助!

编辑:至少我忘记了:这只发生在ICS下。这个应用程序就像是用姜饼和冰激凌做成的护身符。

Edit2:日志猫

代码语言:javascript
运行
复制
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
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-12 04:43:03

你可能会得到TransactionTooLargeException

根据google android guide的建议,您可以使用静态字段或单例在活动之间共享数据。

他们建议“在短时间内共享复杂的、非持久的用户定义对象”。

从您的代码看,这似乎正是您所需要的。

因此,ActivitySearch.class中的代码可能如下所示:

代码语言:javascript
运行
复制
ActivityResults.data = searchList;
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
startActivity(intent);

然后,在ActivityResults activity启动后,您可以从任何位置访问ActivityResults.data。

对于需要在用户会话之间共享的数据,不建议使用静态字段,因为当应用程序在后台运行时(如果框架需要释放资源),应用程序进程可能会被android框架终止并重新启动。在这种情况下,所有静态字段都将被重新初始化。

票数 53
EN

Stack Overflow用户

发布于 2013-02-05 19:27:39

我更喜欢传递大数据的方式是使用枚举。这种方法的一些优点:

  • 不需要创建单例,您始终具有枚举的单个实例;
  • 数据已正确删除活动收到数据后立即将其删除

下面是一个示例:

代码语言:javascript
运行
复制
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);
    }
}

更多信息。

票数 33
EN

Stack Overflow用户

发布于 2012-10-10 20:49:57

如果您将大量信息从一个Activity传递到另一个app,则可能会使应用程序变慢。

或者,使用全局类来存储变量,您可以使用它轻松地获取或设置任何值。这可以在全局文件中声明。

请参阅此链接:http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12819617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档