Frage

Ich habe eine Funktion, die meine SQLite-Datenbank mit Einträgen einer http-Abfrage füllt:

try {
        stringEntity = new StringEntity(SQL);
        httpPost.setEntity(stringEntity);
        httpResponse = httpClient.execute(httpPost);
        httpEntity = httpResponse.getEntity();
        bos = new ByteArrayOutputStream();
        httpEntity.writeTo(bos);

        data = bos.toString();

        reader = new BufferedReader(
                  new StringReader(data));

        try {
            //SAVE DATA IN MY DB || WORKS
        } catch(IOException e) {
          e.printStackTrace();
        }

    } catch (IOException e3) {
        // TODO Auto-generated catch block
        e3.printStackTrace();
    }

Ich versuche, den Text einer Textansicht für meine Aktivität festzulegen, bevor die Prozedur beginnt (vor dem ersten "try {.." in meinem Code, den ich postet). aber der Text wird sich nicht ändern, weil meine Aktivität zu beschäftigt ist, um die Daten zu erhalten (ich denke. Ich habe keine andere Erklärung ..)

irgendwelche Vorschläge?

danke, prexx

UPDATE '' Daten von AsyncTask abrufen ''

 txtAction.setText("Loading...");

    AsyncTask<String, String, String> test = new cAsyncTask();

    try {
        data = test.execute(URL).get();

        reader = new BufferedReader(
                  new StringReader(data));

        while ((line = reader.readLine()) != null) {
            //SAVE DATA IN DB || WORKS
            }
        }

    } catch(IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Meine asynchrone Aufgabe:

class cAsyncTask extends AsyncTask<String, String, String> {

protected String doInBackground(String... urls) {
    int count = urls.length;
    String data = "";
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost;
    StringEntity stringEntity;
    HttpResponse httpResponse;
    HttpEntity httpEntity;
    ByteArrayOutputStream bos;
    String line;
    BufferedReader reader;
    for (int i = 0; i < count; i++) {
        httpPost = new HttpPost(urls[i].toString());
        try {
            stringEntity = new StringEntity(SQL);
            httpPost.setEntity(stringEntity);
            httpResponse = httpClient.execute(httpPost);
            httpEntity = httpResponse.getEntity();
            bos = new ByteArrayOutputStream();
            httpEntity.writeTo(bos);

            data = bos.toString();

        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
    }
    return data;
}

protected void onProgressUpdate(String... progress) {

}

protected void onPostExecute(String result) {
    String test = result;
}

War es hilfreich?

Lösung

Fügen Sie den ausgelasteten Teil Ihres Codes in einen separaten Thread ein.

Sehen Sie sich das Dienstprogramm AsyncTask an

Rufen Sie AsyncTask.execute() direkt nach textview.setText("foo") auf und es wird Ihnen gut gehen :)

Grüße

UPDATE mit Codebeispiel:

 txtAction.setText("Loading...");
 AsyncTask<String, String, String> test = new cAsyncTask();
 test.execute("http://...");

class cAsyncTask extends AsyncTask<String, String, String> {

protected String doInBackground(String... urls) {
    int count = urls.length;
    String data = "";
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost;
    StringEntity stringEntity;
    HttpResponse httpResponse;
    HttpEntity httpEntity;
    ByteArrayOutputStream bos;
    String line;
    BufferedReader reader;
    for (int i = 0; i < count; i++) {
        httpPost = new HttpPost(urls[i].toString());
        try {
            stringEntity = new StringEntity(SQL);
            httpPost.setEntity(stringEntity);
            httpResponse = httpClient.execute(httpPost);
            httpEntity = httpResponse.getEntity();
            bos = new ByteArrayOutputStream();
            httpEntity.writeTo(bos);

            data = bos.toString();

        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
    }
     reader = new BufferedReader(
                  new StringReader(data));
       String line = "";
        while ((line = reader.readLine()) != null) {
            //SAVE DATA IN DB || WORKS
     }
    return data;
}


protected void onPostExecute(String result) {
    String test = result;
   textView.setText("Done!");
}

}

Der Schlüssel besteht darin, den gesamten belegten Code in die doInBackGround-Methode einzufügen, die in einem separaten Thread ausgeführt wird.Alle UI-Änderungen müssen sich im selben UI-Thread befinden. Dies kann in der onPostExecute-Methode erfolgen, die im selben UI-Thread ausgeführt wird

Andere Tipps

Sie könnten versuchen, invalidate () in TextView aufzurufen.Die Verwendung asynchroner Aufgaben ist jedoch eine bewährte Methode für Methoden zum Laden hoher Datenmengen.Dadurch wird der Benutzer bei der Steuerung der Benutzeroberfläche nicht unterbrochen.

Es hat nichts mit "zu beschäftigt" zu tun, sondern mit der Tatsache, dass der Text nur gesetzt wird, wenn die Methode zurückkehrt.Und mit Ihrem Netzwerk wird sich dies verzögern.

Übrigens.im Honeycomb-Netzwerk im UI-Thread wird eine Ausnahme ausgelöst und Ihre App beendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top