5

我有一个 asyncTaskProc 从数据库中读取一些信息并将其写入用户界面...

该代码在 Android 4.0 上完美运行,但在 2.3 上无法运行......这是代码

新的异步任务

`公共类 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

任何建议都会非常感谢!

并为英语错误感到抱歉:D

4

3 回答 3

10

您应该使用在主线程上创建的Handler启动 AsyncTask 。所以用这个替换你run()在 IceCastPoll 中的方法:

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

@Override
public void run() {
   handler.post(new Runnable() {
      public void run() {
          new AsyncTaskProc().execute();
      }
   });
 }
于 2012-11-07T10:38:04.087 回答
1
 new AsyncTaskProc().execute();    

不要将此代码放在线程中。

因为它已经是一个Handler。

简单在任何你需要的地方执行代码,比如 new AsyncTaskProc().execute(); 够了我的朋友

于 2012-11-07T10:28:39.767 回答
0

您的代码中的一个快速建议:您为什么findViewById()每次都这样做,因为您试图以特定的时间间隔执行 AsyncTask,所以每次都这样做是不可行的。

相反,在onCreate()方法中找到所有这些视图。

于 2012-11-07T10:32:11.947 回答