Threading in Android (Datenbank aktionen)

  • 5 Antworten
  • Letztes Antwortdatum
M

Madlip

Gast
Hallo Community,

ich hab da ein Verständnisproblem und zwars geht es um Datenbank aktionen.

Ich hab es bis jetzt immer so gemacht das wenn ich bei einer Activity zu Beginn Daten aus der Datenbank benötige, hab ich einen Thread erstellt, wie folgt:

Code:
try
        {
            new Thread()
            {
                public void run()
                {
                    uiHandler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            
                            String statement =
                                    "select * from " + TABLE_NAME;
                            try
                            {
                                SQLiteDatabase db = dbHelper.getReadableDatabase();
                                if (statement.toLowerCase().startsWith("select "))
                                {
                                    
                                        Cursor cursor = db.rawQuery(statement, new String[] {});
                                        while (cursor.moveToNext())
                                        {
                                            daten in eine ArrayList
                                        }
                                    db.close();
                                }
                            }
                            catch (Exception e)
                            {
                                e.getLocalizedMessage();
                            }
                        }
                    });
                }
            }.start();
        }
        catch (Exception e)
        {
            // TODO: handle exception
        }

Dort hab ich mir halt alle Daten geholt, diesen Prozess habe ich in eine gesonderte Methode ausgelagert "initalisiereDaten". Es hat bisher auch immer geklappt, ich denke weil ich bis jetzt sonst immer mit ArrayAdapter gearbeitet habe. Nun aber brauch ich das in einer ArrayList, weil ich eine Methode habe die anhand der ArrayList, Views aufbaut die relevant für meine main View ist.

Nun bei diesen Fall ist es so, das er erst alle UI Sachen ausführt und dann zum Schluss die Sachen in den Thread macht. Nun bin ich ein wenig verwirrt.

Hat jemand eine Idee was ich nun machen kann?

Also vom Ablauf her wünsche ich mir das so.

in der onCreateView()
{
1. deklaration der UI Elemente
2. Daten aus der DB (Thread-Geschichte)
3. Child View aufbauen und der Main View zuweisen
}

Gruß
Mad
 
Wenn du was in den uiHeadler tust, heist dass nunmal, dass das System den enthaltenen Code "irgendwann" später ausführt.

Du könntest den im uiHandler enthaltenen Code einfach am Ende deines onCreate machen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Madlip
Was mich nun aber beunruhigt wenn ich größere bzw viele Daten aus der dB hole, blockiert das dann nicht den ui thread und die app stürzt ab?

Gesendet von meinem GT-P7510 mit der Android-Hilfe.de App
 
versteh ich nicht warum du einen thread machst und da drin wieder die ausführung an einen handler übergibst.

mach einen thread- im run machst deine db operationen - wennst fertig bist gibst das result an den handler, der solls dann anzeigen.

dafür wurde der asynctask eingeführt.
 
  • Danke
Reaktionen: Madlip
Es macht keinen Unterschied, ob du es im onCreate oder per Handler machst. Beides blockiert den UI Thread beides gleichermaßen. Nur dass du im Handler auch noch einen nicht initialiserten Adapter am Start hast :D

Wenn der DB Zugriff zeitaufwändig ist, ist es schon richtig, wenn du es im AsyncTask/eigenen Thread machst. Aber du musst natürlich bedenken, dass nach dem onCreate() bis zum Eintreffen der Daten der User schon ui Events auslösen kann und nicht auf irgendwelche noch nicht gesetzten Variablen trifft. Da kann man im onCreate() einen leereren Adapter oder (ja nach Anwendungsfall) einen Progress Dialog nutzen.
 
  • Danke
Reaktionen: Madlip
ich hab es jetzt so gemacht wie swordi es gesagt hat, in den ersten Handler initializer ich die daten und in den zweiten Thread weiße ich diese den ui Elementen zu.

den Progress Dialog werd ich dann auch noch einbauen, wegen User-Feedback etc ...
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.402
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
998
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
1.027
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
806
mkuz24
M
A
Antworten
5
Aufrufe
707
swa00
swa00
Zurück
Oben Unten