2012-11-07 46 views
5

tôi có một asyncTaskProc mà đọc một số thông tin từ một DB và viết nó trên ui ...Android: tại sao tôi gặp phải lỗi AsyncTask này?

mã làm việc perfectcly trên Android 4.0 nhưng không hoạt động trên 2.3 ... đây là mã

MỚI AsyncTask

'public class IceCastPoll kéo dài TimerTask {

public IceCastPoll() { 

    } 

    @TargetApi(9) 
    public void run() { 

     new AsyncTaskProc().execute(); 
    } 

}` 

THE thực hiện 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); 
    } 


}` 

CÁC LỖI 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 

Bất kỳ đề nghị nó sẽ được rất rất apreciated!

và sry cho những sai lầm tiếng anh: D

+0

tại sao bạn muốn thực hiện asynctask từ chuỗi? – njzk2

Trả lời

9

Bạn nên khởi động AsyncTask với số Handler được tạo trên chuỗi chính. Vì vậy, hãy thay thế phương thức run() của bạn trong IceCastPoll bằng phương thức này:

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

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

awsome ... hoạt động hoàn hảo! TY người đàn ông! – radudac

1
new AsyncTaskProc().execute();  

Dont đặt mã này bên trong một chủ đề.

Vì nó đã là một Trình xử lý.

Thực thi mã đơn giản khi bạn cần như mới AsyncTaskProc(). Execute(); đủ số bạn bè của tôi là bạn của tôi

0

Một gợi ý nhanh trong mã của bạn: Tại sao bạn làm findViewById() mỗi lần, vì bạn đang cố gắng thực thi AsyncTask tại một khoảng thời gian cụ thể, vì vậy nó không khả thi.

Thay vào đó, hãy tìm tất cả các chế độ xem đó trong phương thức onCreate().

+0

ty để gợi ý ... tôi sẽ làm như bạn nói – radudac

Các vấn đề liên quan