sk2*_*ndy 35 java android android-activity android-4.0-ice-cream-sandwich
我有一个奇怪的问题.我环顾网络但没有找到答案.我还是android编程的初学者.让我们走吧:
我想做的就是用一些数据调用第二个Activity.它适用于小数据,但如果数据变大,第二个Activity将不会显示,第一个Activity将完成.这是我调用方法的代码:
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", searchList);
intent.putExtras(bundle);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
接收数据的部分并不重要.即使我不尝试读取该包,也不会调用该活动.我用以下几行测试了这个:
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("DEBUG","ActivityResult::onCreate()");
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Igo*_* B. 47
您可能正在获取TransactionTooLargeException
根据谷歌Android指南的建议,您可以使用静态字段或单例在活动之间共享数据.
他们推荐它"用于短时间共享复杂的非持久性用户定义对象"
从你的代码看来,这正是你所需要的.
所以ActivitySearch.class中的代码可能如下所示:
ActivityResults.data = searchList;
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
然后,您可以在ActivityResults活动启动后从任何位置访问ActivityResults.data.
对于需要在用户会话之间共享的数据,不建议使用静态字段,因为当app在后台运行时(如果框架需要释放资源),应用程序进程可以被android框架杀死并重新启动.在这种情况下,将重新初始化所有静态字段.
小智 29
我喜欢传递大数据的方式是使用枚举.这种方法的一些优点:
这是一个例子:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息在这里.
| 归档时间: |
|
| 查看次数: |
26061 次 |
| 最近记录: |