0

I want to pass my object oManagement from activity X to Y.

In X:

oManagement = new OrdersManagement();
myIntent = new Intent(this, Y.class);

Then I fill my oManagement object with separate thread.

Then I am waiting when oManagement filled and start another activity:

while (oManagement.allOrders.size() == 0) {
    try {
        Thread.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    if (oManagement.allOrders.size() > 0) {
        myIntent.putExtra("OrdersManagementObject", oManagement);
        this.startActivity(myIntent);
    }
}

And in my Y Activity:

Bundle b = this.getIntent().getExtras();
if (b != null) {
    oManagement = b.getParcelable("OrdersManagementObject");
}

And now surprise -> oManagement is not null, but oManagement.allOrders.size() is 0! :( So i pass my object, but ArrayList inside by object is 0 (in moment of passing was 1 element inside that Array).

How to fix that?

EDIT:

OrdersManagement class:

public class OrdersManagement implements Parcelable {

    public ArrayList<QuantorsOrder> allOrders  = new ArrayList<QuantorsOrder>();

    public OrdersManagement() {
    }

    public OrdersManagement(Parcel in) {
    }

    public static final Creator<OrdersManagement> CREATOR = new Creator<OrdersManagement>() {
        @Override
        public OrdersManagement createFromParcel(Parcel in) {
            return new OrdersManagement(in);
        }

        @Override
        public OrdersManagement[] newArray(int size) {
            return new OrdersManagement[size];
        }
    };

    public void updateListOfOrders(JSONArray jsonArray) throws JSONException {
        if (jsonArray != null && jsonArray.length() > 0)
        {
            JSONObject json;
            for (int i = 0; i < jsonArray.length(); i++)
            {
                json = (JSONObject)jsonArray.get(i);
                if(!IsOrderAlreadyExists(json))
                    addOrder(json);
            }
        }
    }

    private boolean IsOrderAlreadyExists(JSONObject json) throws JSONException
    {
        if (allOrders.isEmpty())
            return false;
        else
        {
            for(QuantorsOrder order : allOrders)
            {
                if (String.valueOf(order.getId()).equals(json.get("id").toString()))
                {
                    return true;
                }
            }
            return false;
        }
    }

    private void addOrder(JSONObject json) throws JSONException {
        allOrders.add(new QuantorsOrder(json));
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
    }
}
K Neeraj Lal
  • 6,768
  • 3
  • 24
  • 33

1 Answers1

2

Your QuantorsOrdershould also implement Parcelable. And in writeToParcel() method you should write the list and read it in constructor like this:

public void writeToParcel(Parcel out, int flags) {
    out.writeTypedList(allOrders);
}

private OrdersManagement (Parcel in) {
    in.readTypedList(allOrders, QuantorsOrder.CREATOR);
}

You should also implement the logic of writing and reading field in your QuantorsOrder class. Here is example on simple class:

   public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     public MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

The main thing here is happening in writeToParcel(...) method and in constructor public MyParcelable(Parcel in).