2010-08-11 17 views
1

J'ai implémenté un temporisateur qui analyse une URL toutes les 15 min (la tâche Timer). Un objet appelé ParsedExampleDataSet obtient ces données.Récupère l'objet d'une méthode (runnable) timer

Chaque fois que j'essaie de récupérer que objet ou un String=Object.toString() de la runnable, je reçois une exception de pointeur nul et des erreurs fatales.

Comment puis-je le récupérer? Y a-t-il une autre implémentation que je pourrais essayer? Pourquoi getBaseContext() ne fonctionne-t-il pas à l'intérieur du runnable?

Voici la plupart de mon code où j'ai un problème. J'ai également ajouté deux commentaires où mon problème se produit.

@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 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

indentation imbriquée folle, essayez de retirer du code de l'onCreate pour plus de clarté. – LordTwaroog

Répondre

1

je pense qu'il est parce que quand vous faites: Context context = this.getBaseContext() dans la classe TimerTask(), vous faites référence à une variable qui est hors de la portée de la classe. Parce que TimerTask() ne sous-classe pas de ContextWrapper, il n'obtient pas le contexte directement. Pour obtenir le contexte de l'activité (heureusement, et pas le contexte de Application), vous devriez faire: Context context = ParsedExampleDataSet.this.getBaseContext(); De cette façon, vous ne devriez probablement pas obtenir d'exceptions de pointeurs NULL.