我有一个奇怪的问题。 我一直在寻找各地的网络,但没有找到答案。 我仍然在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下发生的。 该应用程序的工作原理是用姜饼和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
你可能会得到TransactionTooLargeException
正如谷歌认为Android的引导 ,你可以使用静态字段或单身人士活动之间共享数据。
他们建议为“共享复杂的非持久性的用户自定义对象的持续时间短”
从你的代码似乎这就是你所需要的东西。
所以,你在ActivitySearch.class代码可能看起来是这样的:
ActivityResults.data = searchList;
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
startActivity(intent);
然后你就可以在ActivityResults活动从任何地方访问ActivityResults.data它启动后。
对于需要可以在用户会话之间共享的数据,它不建议使用静态字段,因为应用程序可能会被杀死,而应用程序在后台运行(如果需要的框架来释放资源)的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);
}
}
更多信息这里 。
如果你从一个到其他活动传递一个大型信息则可能是它让应用慢
但使用全局类存储变量使用,你可以很容易地获取或者设置值
在全局文件中声明
看到此链接:
http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/
至于我记得,在这之前API-8(升级Froyo),有一定的局限性,通过意图传递parcelable对象时(如1MB)。 然而,你可能只是你的parcelable数据记到一个文件中,并通过包发送的文件路径您的下一个活动。 后来,编写你的第二个活动,从文件中读取数据,然后删除它。
我不知道为什么它不与大数据工作,但如果你没有找到任何办法解决它,我建议你使用自定义的全球应用, 喜欢这里 。 (同时检查正确的答案,使其作品)