2016-04-15 5 views
3

Ich habe derzeit eine thread/AsyncTask, die ich in Activity A starten. Bevor jedoch AsyncTask gestartet wird, erstellt Activity A ein Objekt, das Activity A'sContext einnimmt, damit es eine NotificationCompat.Builder instanziieren kann. Das Objekt verwendet diesen Builder zum Erstellen/Anzeigen einer Benachrichtigung.Nachricht senden Von Thread erstellt von Aktivität A zu Aktivität B

Dieses Objekt wird dann an die AsyncTask übergeben, da die AsyncTask erstellt und gestartet wird. Dies ermöglicht dem AsyncTask, das Objekt (und die Benachrichtigung) mit seinem Fortschritt zu aktualisieren.

Sobald die AsyncTask hat zwar begonnen, Activity A ruft finish(), und die Aktivität, die es begann, Activity B, wieder aufgenommen wird. Was ich jetzt möchte, ist, dass das Objekt sendet/versucht, eine Nachricht an Activity B zu senden, sobald die AsyncTask gesagt hat, dass es zu 100% abgeschlossen ist. Wie kann ich das erreichen?

PS: lassen Sie mich wissen, wenn ein Bild das Szenario klarer machen würde.

+0

Ich denke, Sie könnten mit 'startActivityForResult()' arbeiten, wenn 'Activity B'' Activity A' startet und dessen Ergebnis benötigt. – yennsarah

+0

Es ist nicht so, dass "Aktivität B" das Ergebnis von "Aktivität A" erfordert, es ist eher so, dass nach Beendigung der Aufgabe "Aktivität B" aktualisiert werden soll. 'Activity A' ist dafür verantwortlich, dass der Benutzer neue Inhalte erstellen und dann hochladen kann (die AsyncTask führt das Hochladen durch), während 'Activity B' eine Möglichkeit ist, hochgeladene Inhalte zu durchsuchen. Die Verwendung von 'startActivityForResult()' wäre großartig, wenn ich 'Activity A' nicht zu 'finish()' zwingen würde, bis der Upload abgeschlossen ist, aber das würde ich lieber nicht tun. – rolledback

+0

Wenn Sie "Aktivität B" einfach neu starten möchten, verwenden Sie 'Absicht' und' Bündel' in 'onPostExecute'. – yennsarah

Antwort

0

Ich habe meine eigene Antwort geschrieben, weil es das Ergebnis der Diskussion war, die in den Kommentaren meiner Frage passiert ist, und so gibt es einen gründlichen Überblick darüber, was ich für eine Lösung getan habe.

Ich endete mit Callbacks wie von verrostetem Gehirn vorgeschlagen. Es ist wichtig zu beachten, dass ich die Verwendung von android.os.Handler zum Erstellen eines Rückrufs, nicht das Callback-Muster, das häufig mit Dingen wie Schaltflächen verwendet wird. Wie auch immer, auf die Lösung.

Schritt 1 war ein Handler in Activity B einzurichten:

messageHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     refreshList(); 
    } 
}; 

Was auch immer in handle ist, was genannt wird, ist, wenn eine Nachricht an den Handler gesendet wird.

Schritt 2 ist ein android.os.Messenger Objekt an Activity A zu senden. Dies kann leicht mit dem Activity A starten verwendet Intent erfolgen:

Intent intent = new Intent(AlbumGalleryActivity.this, CreateNewPhotoHuntActivity.class); 
intent.putExtra("callbackMessenger", new Messenger(messageHandler)); 
startActivityForResult(intent, Constants.REQUEST_CREATE_NEW_PHOTO_HUNT); 

Nun werden alle Nachrichten von der android.os.Messenger gesendet gehen an unsere android.os.Handler.

Schritt 3, der letzte Schritt besteht darin, einen android.os.Message aus dem android.os.Messenger zu erstellen, der zurück an den Handler gesendet werden kann.Im Rahmen meiner Frage, wird diese innerhalb des Objekts durchgeführt, die den Fortschritt der Meldung steuert Aktualisierung:

if(totalProgress >= 100) { 
    notificationBuilder.setContentText("Upload complete! "); 
    notificationBuilder.setSmallIcon(R.drawable.ic_done_black_24dp); 
    notificationBuilder.setProgress(0, 0, false); 
    notificationManager.notify(1, notificationBuilder.build()); 
    Message msg = Message.obtain(); 

    msg.arg1 = 1; 

    try { 
     callbackMessenger.send(msg); 
    } 
    catch (android.os.RemoteException e1) { 
     Log.d(Constants.UploadProgressNotificationTag, e1.toString()); 
    } 
} 

So yep das ist es. Fühlen Sie sich frei zu kommentieren, wenn Sie ein Q haben oder wenn Sie einen Fehler in dem, was ich gepostet habe, sehen. Auch ich denke, mit Broadcasts würde auch dieses Problem lösen, aber das würde erfordern ein bisschen mehr Zeit/Aufwand zu implementieren. Danke an alle, die eine Lösung vorgeschlagen haben!

2

Soweit ich das verstanden habe, wurde Ihre Frage Activity A von Activity B gestartet. Sie können A von B über startActivityForResult starten und dann A beenden, wenn AsyncTask Sie startet. finish() A wenn 100% -Aufgabe von AsyncTask geladen wird und Ergebnis an A sendet. Sie können die Callback-Schnittstelle implementieren, um das Ergebnis von AsyncTask an Aktivität A zu senden. Rufen Sie nun die Aktivität finish() mit der Aktivität setResult() auf und übergeben Sie das Ergebnis in der Absicht an Aktivität B.

+0

Dies ist, was ich zuvor getan habe, aber ich würde es vorziehen, den Benutzer zurück zu 'Aktivität B' gehen zu lassen, während die Aufgabe ausgeführt wird. Siehe meine Antwort auf Amy's Kommentar zu der Frage. – rolledback

+1

In Ordnung, wenn Sie Activity B mit "singleinstance" starten können, befindet es sich in einer neuen Task mit nur Aktivität. Nachdem AsyncTask nur die sed-Absicht zu Aktivität B abgeschlossen hat, erhält sie immer die Absicht und befindet sich immer auf dem Stapel. –

+0

Ich denke, das ist, was Amy oben angedeutet hat, und so werde ich die folgende Frage, die ich ihr gestellt habe, ebenfalls stellen. Wenn der Benutzer sich in einer anderen "Aktivität" befindet, wenn die "Absicht" von dem Objekt gesendet wird, würde dies plötzlich "Aktivität B" im Vordergrund erscheinen lassen? – rolledback

0

Sie können die onPostExecute() -Methode der AsyncTask verwenden.

private class DownloadFilesTask extends AsyncTask<Void, Void, MyObject> { 

    protected Void doInBackground(Void... params) { 
     //do whatever you need to do 
    } 

    protected void onPostExecute(MyObject myObject) { 
     myObject.sendMessage(activityB); 
    } 
} 

Beachten Sie, dass OnPostExecute() läuft auf dem Haupt-UI-Thread, so es in der Lage sein wird, UI-Updates zu behandeln.

+0

Richtig, aber welche Methode/Technik/System/etc. Soll ich eigentlich die Nachricht senden? Ich habe den Teil, wo dem Objekt gesagt wird, dass die Aufgabe abgeschlossen ist, nur nicht das Senden der Nachricht. – rolledback

+0

@rolledback können Sie eine 'Callback' oder' Schnittstelle' erstellen und wenn die Aufgabe abgeschlossen ist, sagen Sie Ihre Callback-Methode zu gehen und informieren Sie die Listener. –

Verwandte Themen