2016-09-13 2 views
0

bekommen möchte ich oManagement X aus der Tätigkeit mein Objekt zu übergebenkann ich nicht Gegenstand von einer Aktivität zur anderen (android)

In X Y:

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

Dann fülle ich meine oManagement Objekt mit separatem Thread.

Dann warte ich, wenn oManagement gefüllt und eine andere Aktivität starten:

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); 
    } 
} 

Und in meiner Y Aktivität:

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

Und jetzt Überraschung ->oManagement ist nicht null, aber oManagement.allOrders.size() 0 ! :(Also gebe ich mein Ziel, aber ArrayList innerhalb von Objekt 0 (in Moment des Führens war 1 Element in diesem Array)

Wie das beheben

EDIT:.?

OrdersManagement Klasse:

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) { 
    } 
} 
+1

Wir müssen wahrscheinlich die Quelle für die 'OrdersManagement' Klasse sehen. Möglich, dass dort ein Parzellierungsproblem vorliegt. – emerssso

+0

Es scheint, dass Ihre 'startActivity()' befindet sich in einer Endlosschleife – Shaishav

+0

überprüfen Sie, wie Sie den Schlüssel in Ihrer zweiten Aktivität extrahieren. Ich werde den Schlüssel in der ersten Aktivität so deklarieren. public final static Zeichenfolge EXTRA_ORDERSMANAGEMENT = "OrdersManagementObject"; Dann extrahiere ich den Schlüssel in der zweiten Aktivität wie dieses Bündel b = this.getIntent(). GetExtras (MainActivity.EXTRA_ORDERSMANAGEMENT); – AK1

Antwort

2

Ihre QuantorsOrder sollte auch Parcel implementieren und in writeToParcel() Methode sollten Sie die Liste schreiben und es in Konstruktor wie folgt lauten:.

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

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

Sie sollten auch die Logik des Schreibens und Lesefeldes in Ihre QuantorsOrder Klasse implementieren. Hier ist beispielsweise auf einfache Klasse:

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(); 
    } 
} 

Die Hauptsache ist hier in writeToParcel(...) Methode geschieht und in Konstruktor public MyParcelable(Parcel in).

Verwandte Themen