2013-04-05 1 views
1

Droit Je pense que dans ce cas, vous devriez me considérer comme un noob complet, je suis au-dessus de ma tête.Android, en utilisant une tâche asynchrone pour récupérer le texte de l'URL

J'ai essayé de concocter ce que je comprends à ce sujet ensemble de plusieurs tutoriels partiels traitant chacun d'un aspect différent que je veux faire. En résumé, tout ce que je veux faire, c'est lire du texte à partir d'une URL à afficher dans un affichage de texte, je crois comprendre que j'ai besoin d'une AsyncTask pour le faire depuis la mise à jour 3.0.

Toute aide sur où je me trompe serait super car je ne comprends pas ce qui cause l'erreur et comment réparer.

Je sais que le code contenu dans try et catch du doInBackground fonctionne seul avant la mise à jour 3.0. Si cela aussi doit être modifié pour fonctionner avec un Async mais je ne sais pas. J'imagine aussi que d'autres problèmes surgiront probablement une fois que celui-ci sera trié, si quelqu'un remarque quelque chose d'évident, je serais reconnaissant si vous pouviez le signaler.

String Event; 
TextView eventText; 
TextView titleText; 

String HTML; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.newevent); 

    titleText = (TextView) findViewById(R.id.Title); 
    eventText = (TextView) findViewById(R.id.Event); 

    new eventupdate().execute(); 


} 

public class eventupdate extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... url) { 

     try { 

      Thread.sleep(4000);     

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpGet httpGet = new HttpGet(
        "http://masterzangetsu.eu/Apps/rocksoctest"); // URL! 
      HttpResponse response = httpClient.execute(httpGet, 
        localContext); 
      String result = ""; 

      BufferedReader reader = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent())); 

      String line = null; 
      while ((line = reader.readLine()) != null) { 
       result += line + "\n"; 
       HTML = result; 
      } 

     } catch (InterruptedException e) { 

      e.printStackTrace(); 


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

     eventText.setText("" + HTML); 

     // TODO Auto-generated method stub 
     return null; 
    } 


} 

Et l'erreur est LogCat:

W/dalvikvm(394): threadid=9: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime(394): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(394): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(394): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
E/AndroidRuntime(394): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
E/AndroidRuntime(394): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
E/AndroidRuntime(394): at java.lang.Thread.run(Thread.java:1019) 

E/AndroidRuntime(394): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

E/AndroidRuntime(394): at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
E/AndroidRuntime(394): at android.view.ViewRoot.requestLayout(ViewRoot.java:629) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.ScrollView.requestLayout(ScrollView.java:1291) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.TextView.checkForRelayout(TextView.java:5521) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2724) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2592) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2567) 
E/AndroidRuntime(394): at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:81) 
E/AndroidRuntime(394): at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:1) 
E/AndroidRuntime(394): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
+0

Voir ici: https://www.youtube.com/watch?v=JqFkkXMwWDg pour une présentation vidéo d'un code source qui explique l'extraction de données du web par AsyncTask de manière plus détaillée. Espérons qu'après avoir regardé vous aurez une meilleure idée de comment et pourquoi cela fonctionne. – FoamyGuy

Répondre

5

Cette ligne ici

eventText.setText("" + HTML); 

est la cause de votre problème. Vous ne pouvez pas mettre à jour le UI du doInBackground(). Cela doit être fait dans l'une des autres méthodes ou renvoyé à une méthode principale Activity. Ici vous pouvez le faire dans onPostExecute()

Read through the AyncTask Docs

Il y a différentes façons d'y parvenir, mais vous pouvez changer votre AsyncTask pour revenir résultat à onPostExecute()

public class eventupdate extends AsyncTask<String, Void, String> // change last param 

puis ajouter onPostExecute() méthode et changer return déclaration doInBackground()

public class eventupdate extends AsyncTask<String, Void, String> 

@Override 
protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     eventText.setText("" + result); 
} 

@Override 
    protected String doInBackground(String... url) { 
    // do your work 
    return HTML; 
+0

merci pour votre réponse, j'ai ajouté la ligne à la { \t \t \t \t onPostExecute() protected void \t \t eventText.setText ("" + HTML); \t \t \t \t \t} mais maintenant il ne fait rien –

+1

Vous êtes les bienvenus. Heureux je pourrais aider – codeMagic

+0

non comme rien ne se passe ... rien n'est retourné et je ne reçois aucune erreur –

Questions connexes