2016-05-23 10 views
0

Ich schreibe eine Android-Anwendung, die Daten aus einem SQLite Database liest und zeigt dann die Daten auf einem nächsten Bildschirm. Wann immer ich eine Abfrage für die Datenbank machte, würde ich eine Fehlermeldung erhalten, dass zu viel Arbeit am Hauptthread getan wird.Android zusätzliche Threads und Looper

Ich legte meine Abfrage dann in einem neuen Thema:

 (new Thread() 
     { 
      public void run() 
      { 
       Looper.prepare(); 
       try 
       { 
        FPJobCardWizard data = dbHelperInstance.loadFPJobCardWizardFull(fitmentHash); 
        wState.fitmentItemSet(data.fitmentItemGet()); 
       } catch (Exception e) {e.printStackTrace();} 
       Looper.loop(); 
      } 
     }).start(); 

nun die gui/Haupt-Thread ist abgeschlossen, es ist Operation vor der Abfrage Vollständigkeit und als Folge des data Variable ist immer noch leer. Ich lese ein paar Posts und die API-Dokumentation und es scheint, dass ich eine Looper verwenden muss (das scheint die richtige Lösung zu sein), aber ich habe noch nie einen Looper benutzt und kann es anscheinend nicht zum Laufen bringen.

Bitte überprüfen Sie den obigen Code und führen Sie mich in die richtige Richtung.

Vielen Dank im Voraus.

+0

einen Handler die Daten an den UI-Thread zu senden. –

Antwort

0

die beste Wahl ein AsyncTask hier verwenden werden, wie es werden Sie alle Hintergrundarbeit in einem Hintergrund-Thread ausführen können, dann, wenn das Ergebnis erzeugt wird, es gilt den UI-Thread mit:

AsyncTask life cycle

so, wie im Lebenszyklus von AsyncTask erklärt, können Sie doInBackground() alle Ihre Hintergrundarbeit in dem Verfahren tun und dann tun alle Ihre UI Arbeit an der Methode onPostExecute(), die nach der Einnahme des Ergebnisses aus doInBackground() Methode ausgeführt wird entsprechend dem Lebenszyklus, und setzen Sie Ihre Hände mehr auf die AsyncTask, einen Blick auf die this example das folgende Beispiel Code lautet:

public class AsyncTaskTestActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // This starts the AsyncTask 
     // Doesn't need to be in onCreate() 
     new MyTask().execute("my string paramater"); 
    } 

    // Here is the AsyncTask class: 
    // 
    // AsyncTask<Params, Progress, Result>. 
    // Params – the type (Object/primitive) you pass to the AsyncTask from .execute() 
    // Progress – the type that gets passed to onProgressUpdate() 
    // Result – the type returns from doInBackground() 
    // Any of them can be String, Integer, Void, etc. 

    private class MyTask extends AsyncTask<String, Integer, String> { 

     // Runs in UI before background thread is called 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      // Do something like display a progress bar 
     } 

     // This is run in a background thread 
     @Override 
     protected String doInBackground(String... params) { 
      // get the string from params, which is an array 
      String myString = params[0]; 

      // Do something that takes a long time, for example: 
      for (int i = 0; i <= 100; i++) { 

       // Do things 

       // Call this to update your progress 
       publishProgress(i); 
      } 

      return "this string is passed to onPostExecute"; 
     } 

     // This is called from background thread but runs in UI 
     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 

      // Do things like update the progress bar 
     } 

     // This runs in UI when background thread finishes 
     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

      // Do things like hide the progress bar or change a TextView 
     } 
    } 
}