2012-11-07 9 views
5

私はDBからいくつかの情報を読み、UI上でそれを書くasyncTaskProcを持っている...Android:なぜこれらのAsyncTaskエラーが発生するのですか?

コードは、Android 4.0にperfectcly動作しますが、2.3では動作しません... ここでは、コード

です

NEW 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:D

+0

地球上であなたがスレッドからasynctaskを実行したいと思う理由は? – njzk2

答えて

9

メインスレッドで作成されたHandlerでAsyncTaskを開始する必要があります。だから、IceCastPollであなたのrun()メソッドは、この1と交換してください:

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

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

awsome ... that perfectcly works! TY男! – radudac

1
new AsyncTaskProc().execute();  

いけないスレッド内でこのコードを置きます。

これは既にハンドラであるためです。

シンプル新しいAsyncTaskProc()のようなコードを実行します。十分な私の友だち

0

あなたはいつもfindViewById()をやっているのですが、いつもAsyncTaskを特定の間隔で実行しようとしているので、毎回それを実行するのが現実的ではありません。

代わりにonCreate()メソッド内のすべてのビューを検索してください。

+0

tyの提案...あなたの言ったようにやるよ – radudac

関連する問題