Question

i ont une fonction de remplissage mon SQLite DB avec les entrées d'une requête http:

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();
    }

Ce que j'essaie de faire est de mettre le texte d'un textview sur mon activité avant le début de la procédure (devant le premier « try {.. » dans mon code i postet). mais le texte ne changera pas, parce que mon activité est trop occupé pour obtenir les données (i think.I ont pas d'autre explication ..)

suggestions?

Merci, prexx

UPDATE '' Obtenir des données de AsyncTask ''

 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();
    }

Mon Async Tâche:

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;
}
Était-ce utile?

La solution

Placez la partie occupée de votre code dans un thread séparé.

Regardez le AsyncTask utilitaire

Appel AsyncTask.execute() juste après textview.setText("foo") et u ira bien:)

Cordialement

Mise à jour avec exemple de code:

 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!");
}

}

La clé est de mettre tout le code occupé dans la méthode qui sera doInBackGround fonctionne dans un thread séparé. Toute modification de l'interface utilisateur doit être dans le même thread d'interface utilisateur et cela pourrait être fait dans la méthode onPostExecute qui sera exécuté dans le même thread d'interface utilisateur

Autres conseils

Vous pouvez essayer de invalidate d'appel () sur TextView. Mais l'utilisation de tâches asynchrones est une meilleure pratique pour les méthodes de chargement de données lourdes. Ce ne sera pas l'utilisateur d'interruption dans les contrôles de l'interface utilisateur de fonctionnement.

Il n'a rien à voir avec « trop occupé », mais avec le fait que le texte ne sera réglé lorsque la méthode retourne. Et avec votre réseau ce sera retardée.

BTW. sur le réseau en nid d'abeille sur un fil interface utilisateur lancera une exception et de tuer votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top