2010-12-09 4 views
1

J'ai donc une petite application sur laquelle je travaille qui gratte les bandes dessinées du web et les affiche sur mon téléphone. Rien d'extraordinaire, juste l'utiliser pour apprendre les ficelles du métier. La fonction appelée comicReload(); fait la plupart des travaux et il est appelé à plusieurs reprises dans l'application (à la première exécution, et lorsque l'utilisateur clique sur certains boutons Voici la fonction:.Android: Fonction ne fonctionne pas dans le fil, mais fonctionne autrement (en essayant d'ajouter ProgressDialog)

public void comicReload() throws IOException { 
    //clears some Vectors that have things in them from the last run 
    imagetitles.clear(); 
    imagetext.clear(); 
    imagelinks.clear(); 

    //forms the link it will connect to, and connects 
    connector = siteBase + Integer.toString(comicNumber); 
    doc = Jsoup.connect(connector).get(); 
    media = doc.select("[src]"); 

    //gets the required media from the site 
    for (Element src : media) { 
     if (src.tagName().equals("img")); 
      imagetitles.add(src.attr("alt")); 
      imagetext.add(src.attr("title")); 
      imagelinks.add(src.attr("src")); 
    } 

    //some variables I could probably get rid of, but it's easy to read 
    Integer titlesize = imagetitles.size(); 
    Integer textsize = imagetext.size(); 
    Integer linkssize = imagelinks.size(); 

    comicTitle = (imagetitles.get(titlesize-4)); 
    hoverText = (imagetext.get(textsize-4)); 
    comicLink = (imagelinks.get(linkssize-4)); 

    //gets the picture I am looking for along with the associated text 
    URL url = new URL(comicLink); 
    InputStream is = (InputStream) url.getContent(); 
    image = Drawable.createFromStream(is, "src name"); 

    //finally puts the scraped information into the layout 
    comicView.setImageDrawable(image); 
    title.setText(comicTitle); 
    htext.setText(hoverText); 
} 

Il fonctionne à 100% bien quand on l'appelle, mais . il est un peu lent sur les réseaux 3G alors j'ai essayé d'ajouter un ProgressDialog montrer pendant qu'il charge Ceci est ma tentative (ce qui est le code qui va où je juste avoir comicReload();)

pd = ProgressDialog.show(this, "Getting Comic", "Loading", true, false); 
    new Thread(new Runnable() { 
      public void run() { 
       try { 
        comicReload(); 
       } catch (IOException e) { 
        Log.i("ComicReloadFail","Sam"); 
       } 
       pd.dismiss(); 
       return; 
      } 
    }).start(); 

le fil lui-même fonctionne bien, et quand je mets du code aléatoire à exécuter à la place du bloc try-catch avec le comicReload(), tout va dandy. là, cependant, en cours d'exécution de l'application provoque le spinner ProgressDialog à tourner pendant quelques secondes avant que la force de l'application se ferme. Qu'est-ce qui cause ça? Et pourquoi comicReload() ne fonctionne plus quand il est dans un thread. Je veux juste un moyen d'exécuter cette méthode avec un spinner en cours d'exécution.

Merci d'avance les gars, je sais que c'était beaucoup à lire.

Répondre

1

Vous ne pouvez pas effectuer de mises à jour liées à l'interface utilisateur dans un thread différent de celui qui a créé l'interface utilisateur.

essayer d'utiliser Handler

public static final Handler handlerVisibility = new Handler() { 
    public void handleMessage(Message msg) { 
     int visibility = msg.getData().getInt("visibility"); 
     view.setVisibility(visibility); 
    } 
}; 
+0

Désolé si je suis stupide mais ... qu'est-ce que cela fait pour moi? –

+1

Désolé je ne pourrais pas avoir été clair, ce que vous faites avec ceci placez-le dans votre fil d'interface principal (généralement l'activité), de cette façon vous pouvez envoyer un message de votre thread qui fait la mise à jour être pris en compte car ils sont considérés comme venant du fil de l'interface utilisateur –

+0

Même si je ne connais pas assez pour bien comprendre ce que vous avez dit, vous m'avez donné assez d'informations pour utiliser Google et le faire fonctionner. Donc un chèque vert et un merci pour vous. –

1

Vous ne pouvez pas faire quoi que ce soit-lié interface utilisateur dans un thread de travail. Vous devrez le faire sur le fil de l'interface utilisateur. Il y a des manières faciles de faire cela - vous pouvez appeler Activity.runOnUiThread(), par exemple.

+0

Comment est-ce que je l'utilise exactement, et cela permettra-t-il encore au ProgressDialog de s'afficher? Après tout, c'est ce dont il s'agissait pour moi. –

+0

Le plus simple - gardez votre code tel qu'il est, mais tout ce qui est lié à l'UI se retrouve dans un nouveau Runnable que vous appelez 'runOnUiThread'. – EboMike

Questions connexes