2017-01-16 4 views
-3

Ich erstelle eine einfache Datenbank, ich kann schreiben und lesen erfolgreich.Zeige Daten sofort, wenn ListView Update

Jetzt möchte ich es sofort auf dem Bildschirm zeigen, wenn ich die Daten schreibe.

Ich versuche Thema zu verwenden und thread.start(); nennen es nicht funktioniert

Welche Schritt verfehlen i? jede Hilfe wird dankbar sein.

hier ist mein Thread-Code in Listview, es ist unter Haupt onCreate

Thread thread=new Thread(new Runnable() { 
     @Override 
     public void run() { 
      sqlForBloodSugar = new MySqlForBloodSugar(BloodSugarReportActivity.this, "bloodSugar.db", null, 1); 

      Cursor cursor = sqlForBloodSugar.getReadableDatabase().query("blood", null, null, null, null, null, null); 

      SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(
        BloodSugarReportActivity.this, 
        R.layout.blood_sugar_report_list_item_layout, 
        cursor, 
        new String[]{"_id", "bloodvalue", "eattime", "blooddate"}, 
        new int[]{R.id.item_id, R.id.item_bloodSugar, R.id.item_eatTime, R.id.item_date}, 
        0); 

      listViewBloodReport.setAdapter(simpleCursorAdapter); 
      simpleCursorAdapter.notifyDataSetChanged(); 
     } 
    }); 
    thread.start(); 

Antwort

0

Ich glaube, Sie UI-Elemente aus anderen Thread Problem zu aktualisieren. Wenn es einige Fehlermeldungen gibt, lassen Sie es uns wissen.

Für UI-Elemente aus anderen Thread aktualisieren, müssen Sie runOnUiThread verwenden.

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
       //Do something on UiThread 
      } 
     }); 
+0

danke, ich versuche Ihren Code, es kann immer noch nicht zeigen, dass die Daten sofort ändern. Es gibt keine Fehlermeldung. Die fügen nur erfolgreich wie mein Code. –

+0

was meinst du, wenn du ** sofort ** sagst? –

+0

debuggen und schauen, wo Daten gelöst sind –

0

Sie sollten dies tun, mit Hilfe von AsyncTask (ein intelligenter Hintergrund-Thread) und ProgressDialog

AsyncTask ermöglicht korrekte und einfache Nutzung des UI-Thread. Mit dieser Klasse können Hintergrundoperationen ausgeführt und Ergebnisse im UI-Thread veröffentlicht werden, ohne dass Threads und/oder Handler manipuliert werden müssen.

Eine asynchrone Task wird durch eine Berechnung definiert, die auf einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird. Eine asynchrone Task wird durch 3 generische Typen definiert, genannt Params, Progress und Result, und 4 Schritte, genannt begin, doInBackground, processProgress und end.

Die 4 Schritte

Wenn eine asynchrone Aufgabe ausgeführt wird, geht die Aufgabe, über 4 Stufen:

OnPreExecute(), auf dem UI-Thread aufgerufen wird, unmittelbar nachdem die Aufgabe ausgeführt wird. Dieser Schritt wird normalerweise zum Einrichten der Aufgabe verwendet, z. B. durch Anzeigen einer Fortschrittsleiste in der Benutzeroberfläche.

doInBackground (Params ...), wird im Hintergrund-Thread aufgerufen, unmittelbar nachdem onPreExecute() die Ausführung beendet hat. Dieser Schritt wird verwendet, um eine Hintergrundberechnung durchzuführen, die sehr lange dauern kann. Die Parameter der asynchronen Task werden an diesen Schritt übergeben. Das Ergebnis der Berechnung muss von diesem Schritt zurückgegeben werden und wird an den letzten Schritt zurückgegeben. Dieser Schritt kann auch publishProgress (Progress ...) verwenden, um eine oder mehrere Fortschrittseinheiten zu veröffentlichen. Diese Werte werden im Schritt onProgressUpdate (Progress ...) im UI-Thread veröffentlicht.

onProgressUpdate (Progress ...), wird im UI-Thread nach einem Aufruf von publishProgress (Progress ...) aufgerufen. Der Zeitpunkt der Ausführung ist nicht definiert. Diese Methode wird verwendet, um jede Art von Fortschritt in der Benutzerschnittstelle anzuzeigen, während die Hintergrundberechnung noch ausgeführt wird. Zum Beispiel kann damit eine Fortschrittsleiste animiert oder Protokolle in einem Textfeld angezeigt werden.

onPostExecute (Ergebnis), wird auf dem UI-Thread aufgerufen, nachdem die Hintergrundberechnung abgeschlossen ist. Das Ergebnis der Hintergrundberechnung wird diesem Schritt als Parameter übergeben.Threading Regeln

Es gibt ein paar Regeln, die Threading für diese Klasse befolgt werden müssen, um richtig zu arbeiten:

Die Aufgabe Instanz auf dem UI-Thread erstellt werden müssen. Ausführen (Params ...) muss im UI-Thread aufgerufen werden. Rufen Sie onPreExecute(), onPostExecute (Result), doInBackground (Params ...) und onProgressUpdate (Progress ...) nicht manuell auf. Die Aufgabe kann nur einmal ausgeführt werden (eine Ausnahme ausgelöst wird, wenn eine zweite Ausführung versucht wird.)

Beispielcode: Was der Adapter funktioniert in diesem Beispiel ist nicht wichtig, wichtiger zu verstehen, dass Sie brauchen, um Verwenden Sie AsyncTask, um einen Dialog für den Fortschritt anzuzeigen.

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { 
    ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(viewContacts.this); 
     dialog.setMessage(getString(R.string.please_wait_while_loading)); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
    /* (non-Javadoc) 
    * @see android.os.AsyncTask#doInBackground(Params[]) 
    */ 
    @Override 
    protected ContactsListCursorAdapter doInBackground(Void... params) { 
     cur1 = objItem.getContacts(); 
     startManagingCursor(cur1); 

     adapter1 = new ContactsListCursorAdapter (viewContacts.this, 
       R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); 

     return adapter1; 
    } 

    protected void onPostExecute(ContactsListCursorAdapter result) { 
     list.setAdapter(result); 
     dialog.dismiss(); 
    } 
} 
+0

Vielen Dank für Ihre Begeisterung, ich kenne AsyncTask und wie man es verwendet, aber in Ihrem Code, wo die Doinbackground-Parameter, ich versuche, neue PrepareAdapter1 .execute (simpleCursorAdapter); es ist nicht richtig und cur1 = objItem.getContacts(); , StartManagingCursor (cur1); Ich weiß nicht, was es für –

+0

ist Es ist kein vollständiger Code, es ist nur ein Block von Code in meinem Projekt.Ich kann nicht den gesamten Code hear.I nur sagen, dass Sie AsyncTask für Ihren Zweck verwenden können. –

+0

ich sehe, danke Mann. Ich werde es versuchen. Lass mich zuerst die Lösung in dem Fall finden. –

Verwandte Themen