哪种方式更适合将大量数据从一个活动传递到另一个活动 - android?

时间:2017-02-01 09:47:17

标签: android android-intent android-activity

我需要将一大堆数据从一个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获取数据。

7 个答案:

答案 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 / ...中,也许速度较慢且有冲突,但可以使用