Moin,
ich muss mal wieder nerven.
Also ich verstehe das Konzept der Asynchronen Tasks wie folgt:
- Es gibt Dinge, die auf dem UI Thread durchgeführt werden. Namentlich onPreExecute, onPostExecute und onProgressUpdate.
- Es gibt Dinge, die in einem anderen Thread durchgeführt werden. Namentlich doInBackground.
Das ist zumindest das, was mir die Dokumentation erzählen möchte.
Jetzt stelle ich fest, dass dem eben nicht so ist. onPreExecute, onPostExecute und onProgressUpdate werden auf dem Thread ausgeführt, auf dem die Java-Klasse läuft. Dies muss nicht zwangsläufig der UI Thread sein und ist es in meinem Fall auch überhaupt nicht - irgendwie.
Also Folgendes: ich habe eine Klasse, die im Hintergrund ein paar Daten herunterladen soll.
Der Hintergrunddatenherunterladevorgang wird in einem asynchronen Task dieser Klasse durchgeführt.
Die onPreExecute, onPostExecute und onProgressUpdate haben keinen korrekten Zugriff auf den UI Thread.
ZitatCaused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Nun wollte ich erstmal ein paar Arbeiten vorverlegen. Ich habe mir eine Art Notification Center erstellt (wenn es dafür etwas Fertiges gibt, immer her mit der Info).
Nicht das Ding im OS, welches irgendwelche Informationen ausspuckt. Eher eine Art Beobachter/eigener Listener für alles Mögliche.
Nun stelle ich leicht genervt fest:
NotificationCenter.AddReceiver(new NotificationCallback() {
@Override
public void postNotification(Notification notification)
{
Log.w(TAG, "Guess I got a new 'New Data Available' notification!");
AlertDialog.Builder adb = new AlertDialog.Builder(uiContext);
adb.setTitle("Should I stay or should I download?");
adb.setPositiveButton("Go for it!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.e(TAG, "We will go for it on " + i);
List<CMSType> types = new ArrayList<CMSType>();
for(String key: theMap.keySet())
{
types.add(theMap.get(key));
}
daConnector.loadDataUpdatesForTypes(types);
}
});
adb.setNegativeButton("Leave me alone.", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.e(TAG, "Don't do anything for "+i);
}
});
adb.setMessage("There is new download data available. It should be listed here.");
adb.create().show();
}
}, Connector.NewDataAvailable, null);
Alles anzeigen
Tja, was soll ich sagen...
ZitatCaused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Meine 'anonymous inner class' von NotificationCallback() ist also auch irgendwo, nur nicht auf dem UI Thread.
Weiter unten in der Dokumentation finde ich noch den Hinweis, dass AsyncTask doch bitte nur über den UI Thread aufzurufen sei. Also sämtliche Überlegungen umsonst.
Wie bekomme ich denn jetzt den Download in einem anderen Thread durchgeführt und die Daten wie 'Aktuell heruntergeladen' und 'Gesamt' an den UI Thread überführt, wenn der Download etc.pp. von einer eigenen Klasse aus durchgeführt werden soll?