2012-11-07 21 views
5

मैं एक asyncTaskProc है कि एक DB से कुछ जानकारी पढ़ सकते हैं और ui पर लिख ...एंड्रॉइड: मुझे इन AsyncTask त्रुटि क्यों मिलती है?

कोड Android 4.0 पर काम करता है लेकिन perfectcly 2.3 पर काम नहीं करता ... यहाँ कोड

है

नई ASYNCTASK

`सार्वजनिक वर्ग IceCastPoll फैली TimerTask {

public IceCastPoll() { 

    } 

    @TargetApi(9) 
    public void run() { 

     new AsyncTaskProc().execute(); 
    } 

}` 

ASYNCTASK कार्यान्वयन

+०१२३५१६४१०६
@TargetApi(9) 
class AsyncTaskProc extends AsyncTask<Void, String, Void> { 
    List<Stream> streams=null; 

    @Override 
    protected void onPostExecute(Void result) { 

     textSong =(TextView) findViewById(R.id.textViewCurrentSong); 
     textArtist =(TextView) findViewById(R.id.textViewCurrentArtist); 
     textTit=(TextView) findViewById(R.id.textViewTit); 
     textArt=(TextView) findViewById(R.id.TextViewArt); 
     copertina=(ImageView) findViewById(R.id.imageViewCopertina); 
     new DownloadImageTask((ImageView) findViewById(R.id.imageViewCopertina)).execute("http://service.uniradiocesena.it/OnAir.jpg"); 

     try { 
      for (Stream stream: streams) { 

       try 
       { 
        //Thread.sleep(5000); 
        //textSong.setText((stream.getCurrentSong())); 
        textArt.setText("Artista:"); 
        textTit.setText("Titolo:"); 
        StringTokenizer tokens = new StringTokenizer(stream.getCurrentSong(), "-"); 
        String first = tokens.nextToken(); 
        String second = tokens.nextToken(); 
        textSong.setText(first); 
        textArtist.setText(second); 

       } catch (Exception e) { 
        //Thread.sleep(5000); 
        textSong.setText((stream.getCurrentSong())); 
        textArt.setText("Rotazione:"); 
        textTit.setText(""); 
        textArtist.setText(""); 
       } 
      } 
     } catch (Exception e) { 

      //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show(); 

     } 

    } 

    @Override 
    protected Void doInBackground(Void... unused) { 



     Scraper scraper = new IceCastScraper(); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 


     try { 
      streams = scraper.scrape(new URI("http://r35798.ovh.net:8000/")); 

     } catch (ScrapeException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show(); 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show(); 
     } 




     return (null); 
    } 


}` 

Logcat त्रुटियों

11-07 11:09:49.729: W/dalvikvm(18983): Exception Ljava/lang/RuntimeException; thrown while initializing Landroid/os/AsyncTask; 
11-07 11:09:49.729: W/dalvikvm(18983): threadid=9: thread exiting with uncaught exception (group=0x40018560) 
11-07 11:09:49.739: E/AndroidRuntime(18983): FATAL EXCEPTION: Timer-0 
11-07 11:09:49.739: E/AndroidRuntime(18983): java.lang.ExceptionInInitializerError 
11-07 11:09:49.739: E/AndroidRuntime(18983): at com.example.appuniradiocesena.SwipeyTabsSampleActivity$IceCastPoll.run(SwipeyTabsSampleActivity.java:233) 
11-07 11:09:49.739: E/AndroidRuntime(18983): at  java.util.Timer$TimerImpl.run(Timer.java:284) 
11-07 11:09:49.739: E/AndroidRuntime(18983): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
11-07 11:09:49.739: E/AndroidRuntime(18983): at android.os.Handler.<init>(Handler.java:121) 
11-07 11:09:49.739: E/AndroidRuntime(18983): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
11-07 11:09:49.739: E/AndroidRuntime(18983): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
11-07 11:09:49.739: E/AndroidRuntime(18983): at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 
11-07 11:09:49.739: E/AndroidRuntime(18983): ... 2 more 

कोई भी सुझाव यह बहुत बहुत apreciated हो जाएगा!

और sry अंग्रेज़ी गलतियों के लिए: डी

+0

क्यों पृथ्वी पर आप एक धागे से एक asynctask निष्पादित करने के लिए चाहेगा? सुझाव के लिए – njzk2

उत्तर

9

आपको मुख्य थ्रेड पर बनाए गए Handler के साथ AsyncTask प्रारंभ करना चाहिए। तो यह एक के साथ IceCastPoll में अपने run() विधि की जगह:

private Handler handler = new Handler(Looper.getMainLooper()); 

@Override 
public void run() { 
    handler.post(new Runnable() { 
     public void run() { 
      new AsyncTaskProc().execute(); 
     } 
    }); 
} 
+0

awsome ... जो सही काम करता है! टीवाई आदमी! – radudac

1
new AsyncTaskProc().execute();  

न एक धागा अंदर इस कोड डाल दिया।

क्योंकि यह पहले से ही हैंडलर है।

सरल कोड को निष्पादित करें जहां आपको कभी भी नई AsyncTaskProc() की आवश्यकता है। निष्पादित करें(); इसके पर्याप्त मेरे मित्र

0

आपके कोड में एक त्वरित सुझाव: आप हर बार findViewById() क्यों कर रहे हैं, क्योंकि आप विशेष अंतराल पर AsyncTask निष्पादित करने का प्रयास कर रहे हैं, इसलिए यह हर बार ऐसा करने का व्यवहार्य तरीका नहीं है।

इसके बजाय, onCreate() विधि के अंदर उन सभी विचारों को ढूंढें।

+0

ty ... मैं ऐसा करूंगा जैसा आपने कहा – radudac