2010-08-06 8 views
0

J'ai implémenté une minuterie qui analyse une URL toutes les 15 minutes (la tâche Timer). Un objet que j'ai créé obtient cette donnée. Je l'utilise ensuite pour afficher les données à l'écran. Maintenant, chaque fois que j'essaie de récupérer ce Object/a String = Object.toString() sur le runnable, j'obtiens une exception de pointeur nul et des erreurs fatales. Ma question est de savoir s'il est possible d'utiliser d'autres techniques pour le faire, ou si L'Objet cesse d'exister en dehors de l'exécutable et qu'il n'y a pas grand-chose à faire à ce sujet, si c'est le cas, quelqu'un peut-il le dire? moi s'il y a une autre façon de mettre en œuvre un timer/runnable?Récupération d'une chaîne dans un runnable/TimerTask

Merci beaucoup

ici est la plupart de mon code où j'ai un problème

@Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle) 
      final TextView tv = new TextView(this); 
      TimerTask scanTask; 
      final Handler handler = new Handler(); 
      Timer t = new Timer();     
       scanTask = new TimerTask() { 
        public void run() { 
          handler.post(new Runnable() { 
            public void run() { 
             URL url = null; 
             try { 
              url = new URL("http://www.eurosport.fr/"); 
             } catch (MalformedURLException e3) { 

              e3.printStackTrace(); 
             } 

             /* Get a SAXParser from the SAXPArserFactory. */ 
             SAXParserFactory spf = SAXParserFactory.newInstance(); 
             SAXParser sp; 
             try { 
              sp = spf.newSAXParser(); 
             } catch (ParserConfigurationException e2) { 

              e2.printStackTrace(); 
             } catch (SAXException e2) { 

              e2.printStackTrace(); 
             } 

             /* Get the XMLReader of the SAXParser we created. */ 
             XMLReader xr = null; 
             try { 
              sp = spf.newSAXParser(); 
              xr = sp.getXMLReader(); 
             } catch (SAXException e1) { 

              e1.printStackTrace(); 
             } catch (ParserConfigurationException e) { 

              e.printStackTrace(); 
             } 
             /* Create a new ContentHandler and apply it to the XML-Reader*/ 
             ExampleHandler myExampleHandler = new ExampleHandler(); 
             try { 
              sp = spf.newSAXParser(); 
             } catch (ParserConfigurationException e1) { 
              // TODO Auto-generated catch block 
              e1.printStackTrace(); 
             } catch (SAXException e1) { 
              // TODO Auto-generated catch block 
              e1.printStackTrace(); 
             } 
             xr.setContentHandler(myExampleHandler); 

             /* Parse the xml-data from our URL. */ 
             try { 
              xr.parse(new InputSource(url.openStream())); 
             } catch (IOException e) { 

              e.printStackTrace(); 
             } catch (SAXException e) { 

              e.printStackTrace(); 
             } 
             /* Parsing has finished. */ 

             /* Our ExampleHandler now provides the parsed data to us. */ 
             ParsedExampleDataSet parsedExampleDataSet = 
                         myExampleHandler.getParsedData(); 

             System.out.println(parsedExampleDataSet.toString()); 

             tv.setText(parsedExampleDataSet.toString()); 


            Context context = this.getBaseContext(); 

// I also dont understand why inside the runnable getBaseContext() does not exist ??? 

    Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), 
      R.raw.nature1) 
     context.setWallpaper(mBitmap); 


            } 


          }); 

        } }; 
        // I want to retrieve ParsedExampleDataSEt here in order to use it is it Possible ???? 



        this.setContentView(tv); 



        long temps=1*15*1000; 

       t.scheduleAtFixedRate(scanTask, 300,temps); 
+1

Pouvez-vous montrer le code? –

+1

Montrez une partie de votre code et expliquez ce que vous utilisez sur les servlets côté serveur. ou quoi? (Servlet lui-même est le fil). Si vous mentionnez ces choses, il serait facile pour les gens de répondre :) – Paul

+1

Utiliser un service et une diffusion – Falmarri

Répondre

2

La méthode potentiellement laid: Extend TimerTask et faire une méthode abstraite telle que

public abstract void onUrlRetrivalFinished(String data); 

Lorsque vous créez l'objet TimerTask, vous pouvez désormais effectuer une implémentation anonyme de la méthode et, dans cette méthode, gérer les données extraites.

Le (à mon avis) méthode moins laid:

Faire une interface telle que:

public interface UrlRetrivalListener { 
    public void onUrlRetrivalFinished(String data); 
} 

Sous-classe TimerTask et faire un domaine tel que:

private UrlRetrivalListener listener; 

maintenant effectuez une implémentation de l'interface de l'écouteur mentionnée ci-dessus, dans laquelle vous gérez la chaîne extraite. Passez l'écouteur en tant que paramètre à votre TimerTask, ou laissez le TimerTask avoir plus d'un écouteur, et en récupérant/analysant les données nécessaires, vous appelez simplement la méthode listenersUrlRetrivalFinished().

Cela devrait faire l'affaire, mais quelques informations supplémentaires seraient bien.

+0

Je viens d'ajouter la plupart de mon code. Je peux obtenir les données et les afficher sur l'écran. mais je ne peux pas l'utiliser en dehors du runnable. Si vous sentez que mon code n'est pas assez bon, n'hésitez pas à modifier et me donner des commentaires car je suis nouveau sur Android! Cheers J'ai ajouté mes questions principales comme commentaires dans le code;) – Amine