我需要将一大堆数据从一个activity
传递到另一个activity
,哪种方式更好?
第一种方式(例如):
ArrayList<myModel> myList = new ArrayList<myModel>();
intent.putExtra("mylist", myList);
第二种方式(例如):
ActivityTwo act = new ActivityTwo();
act.getDataMethod(listValues);
Intent i = new Intent(this, ActivityTwo.class);
startActivity(i);
在另一个activity
(ActivityTwo)中,我从getDataMethod
获取数据。
答案 0 :(得分:1)
对我来说序列化对象/列表是更好的方法。
`Intent intent = ....
Bundle bundle = new Bundle();
ArrayList<String> myList = new ArrayList<String>();
bundle.putSerializable("mylist", myList);
intent.putExtras(bundle);`
答案 1 :(得分:1)
如果你有一个巨大的数据列表,最好的方法是在Singleton java类中保存数据并使用set / get来保存&amp;获取应用程序级别的数据。
将大数据作为意图捆绑包共享可能会丢失数据。
Application.class
add this in you manifest file
<application
android:name=".App"
-----
</application>
public class App extends Application {
public ArrayList<Object> newsList;
@Override
public void onCreate() {
super.onCreate();
}
public void setHugeData(ArrayList<Object> list){
this.newsList = list;
}
public ArrayList<Object> getHugeData(){
return newsList;
}
}
in ActivityA.class
ArrayList<Object> info = new ArrayList<>();
// save data
((App)getApplication()).setHugeData(info);
in ActvityB.class
ArrayList<Object> info = new ArrayList<>();
// get the data
info = ((App)getApplication()).getHugeData();
答案 2 :(得分:1)
如果您要发送的数据确实很大(大约1MB)。传递它的最好方法是将其存储在ActivityA的持久性存储中,并在ActivityB中对其进行访问。
通过Parcerable / Serializable传递数据的方法存在风险,因为当尝试传递1MB的数据时,您可能会以TransactionTooLargeException
结尾。
通过Singleton类传递数据的方法更加糟糕,因为当您在ActivityB中并且重新创建了应用程序(背景很长/内存不足)时,您将丢失Singleton中的数据(重新创建了进程)并且没有人设置它将被启动,ActivityB将被启动,并且它将没有来自AcitvityA的数据(因为它从未创建过)。
通常,您不应通过意图传递数据,而应传递参数/标识符,然后可以使用这些参数/标识符从db / network / etc中获取数据。
答案 3 :(得分:0)
使用第一种方法。但是,您需要使用以下方法调用将其放入Intent
:
ArrayList<String> myList = new ArrayList<String>();
intent.putStringArrayListExtra("mylist",myList);
要从接收Activity
中获取目标列表:
ArrayList<String> myList = getIntent().getStringArrayListExtra("mylist");
答案 4 :(得分:0)
您可以使用Eventbus这样的库来通过活动传递模型,或者您可以将模型放在ContentValues(https://developer.android.com/reference/android/content/ContentValues.html)类中 - 它是parcable并且您可以通过intent传递它。一个好的做法是在Model类中实现两个方法 - toContentValues()和fromContentValues()。
这样的事情:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.github.ilmoeuro.vocaltrainer.VocalTrainerController">
<children>
<Label fx:id="notificationLabel" prefHeight="30.0" text="hi there!" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="33.0">
<font>
<Font size="21.0" />
</font>
</Label>
<Circle fx:id="ball" fill="DODGERBLUE" radius="10.0" stroke="BLACK" strokeType="INSIDE" />
<ChoiceBox fx:id="mixerSelect" layoutX="12.0" layoutY="124.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="30.0" minWidth="-Infinity" prefHeight="30.0" prefWidth="320.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<LineChart createSymbols="false" fx:id="spectrum" animated="false" layoutY="69.0" legendVisible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="70.0">
<xAxis>
<NumberAxis animated="false" autoRanging="false" side="BOTTOM" tickUnit="0.1" upperBound="3.3" />
</xAxis>
<yAxis>
<NumberAxis animated="false" autoRanging="false" side="LEFT" tickUnit="10" upperBound="100" />
</yAxis>
</LineChart>
</children>
</AnchorPane>
答案 5 :(得分:0)
在Android中将大数据列表从一个Activity传递到另一个Activity的最佳方法是Parcelable。首先创建Parcelable pojo类,然后创建Array-List并像密钥和值对一样传入bundle,然后将bundle传递给intent extras。
下面我给出了一个实现Parcelable接口的User Pojo类示例。
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by CHETAN JOSHI on 2/1/2017.
*/
public class User implements Parcelable {
private String city;
private String name;
private int age;
public User(String city, String name, int age) {
super();
this.city = city;
this.name = name;
this.age = age;
}
public User(){
super();
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@SuppressWarnings("unused")
public User(Parcel in) {
this();
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
this.city = in.readString();
this.name = in.readString();
this.age = in.readInt();
}
public int describeContents() {
return 0;
}
public final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
public User createFromParcel(Parcel in) {
return new User(in);
}
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(city);
dest.writeString(name);
dest.writeInt(age);
}
}
ArrayList<User> info = new ArrayList<User>();
info .add(new User("kolkata","Jhon",25));
info .add(new User("newyork","smith",26));
info .add(new User("london","kavin",25));
info .add(new User("toranto","meriyan",30));
Intent intent = new Intent(MyActivity.this,NextActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("user_list",info );
intent.putExtras(bundle);`
startActivity(intent );
答案 6 :(得分:-1)
1,您可以使用Singleton类,如以下代码所示:
public class MusicListHolder {
private ArrayList<MusicInfo> musicInfoList;
public ArrayList<MusicInfo> getMusicInfoList() {
return musicInfoList;
}
public void setMusicInfoList(ArrayList<MusicInfo> musicInfoList) {
this.musicInfoList = musicInfoList;
}
private static final MusicListHolder holder = new MusicListHolder();
public static MusicListHolder getInstance() {
return holder;
}
}
简单又有用!
2,您可以使用应用程序,只需在使用前将数据放入应用程序中即可!
3,您可以使用Eventbus
4,您可以将数据放在文件/ sqlite / ...中,也许速度较慢且有冲突,但可以使用