2016-05-09 6 views
1

Ich habe eine Klasse, die ResultReceiver erweitert. Wenn ich meine Hauptaktivität mit der onCreate-Methode starte, rufe ich einen IntentService auf, um einige Daten aus dem Internet zu holen.Pflegen Sie eine Objektreferenz beim Schreiben auf Parzelle in Android

Da der Dienst Movie-Objekte an die Hauptaktivität übergeben muss, muss der ResultReceiver in der Aktivität instanziiert und an den Dienst übergeben werden.

final class MovieResultReceiver extends ResultReceiver { 

    private static final String MOVIE_ARRAY = "movie array"; 
    private static final int RESULT_SUCCESS= 101000; 


    private ResultProcessor mProcessor; 

    MovieResultReceiver(Handler handler) { 
     super(handler); 
    } 


    interface ResultProcessor { 
     void onReceiveResult(int resultCode, Bundle resultData); 
    } 

    void setReceiver(ResultProcessor resultProcessor) { 
     mProcessor = resultProcessor; 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     if (mProcessor != null) { 
      mProcessor.onReceiveResult(resultCode, resultData); 
     } 
    } 


    void notifyReceiver(Bundle bundle, Parcelable[] parcelables) { 
     bundle.putParcelableArray(MOVIE_ARRAY,parcelables); 
     send(RESULT_SUCCESS,bundle); 
    } 


    private MovieResultReceiver(Parcel in) { 
     super(new Handler()); 
    } 

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

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 

     // I need to pass a reference to MainActivity, 
     // so I need to write it to the parcel somehow 
    } 
} 

Die ResultProcessor Membervariable wird auf meine Haupttätigkeit eingestellt werden, weil sie die Daten verwenden werden, dass der Dienst holen wird.

Meine Frage ist:

Wie kann ich einen Verweis auf die Haupttätigkeit aufrechtzuerhalten, wenn ich die ResultReceiver als Absicht zusätzliche passieren?

Was muss ich zum "Paket schreiben"?

Antwort

1

Sie können dies nicht tun, und es ist richtig, weil Parcel ist zeitunabhängig Objekt - es kann wiederhergestellt werden, auch nachdem ein Activity neu erstellt wird, so dass der Verweis darauf wird sich ändern.

Sie können einen Verweis auf die Hauptaktivität über Application Objekt oder ein statisches Feld übergeben. Dieses Feld wird in der Aktivität onCreate initialisiert und beim Lesen von Daten aus dem Paket verwendet.

Verwandte Themen