Android 2.3.4上的AsyncTask错误

时间:2013-03-14 22:09:17

标签: android android-asynctask runtime-error

当我在我的三星Galaxy S3(4.1.1)上运行我的AsyncTask类时,它运行得很好但是当我在我的HTC Android(2.3.4)上运行它时,我得到以下错误。这是什么问题?

这是班级。

    public class enemyHandler extends AsyncTask<String, Integer, String>
    {
        @Override
        protected String doInBackground(String... arg0) {
            if(System.currentTimeMillis() - lastSpawn >= 2000)
            {
                Enemy x = new Enemy(SCREEN_WIDTH, SCREEN_HEIGHT, enemy.getHeight());
                enemies.add(x);

                lastSpawn = System.currentTimeMillis();
            }
            for(int i = 0; i < enemies.size(); i++)
            {
                Enemy tempE = enemies.get(i);
                if(tempE.x <= 0 - enemy.getWidth())
                    enemies.remove(tempE);
            }
            return null;
        }
    }

Logcat输出:

03-14 18:04:53.656: E/AndroidRuntime(4279): FATAL EXCEPTION: Thread-12
03-14 18:04:53.656: E/AndroidRuntime(4279): java.lang.ExceptionInInitializerError
03-14 18:04:53.656: E/AndroidRuntime(4279):     at com.jister13.plane.Main$SView.run(Main.java:188)
03-14 18:04:53.656: E/AndroidRuntime(4279):     at java.lang.Thread.run(Thread.java:1027)
03-14 18:04:53.656: E/AndroidRuntime(4279): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-14 18:04:53.656: E/AndroidRuntime(4279):     at android.os.Handler.<init>(Handler.java:121)
03-14 18:04:53.656: E/AndroidRuntime(4279):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-14 18:04:53.656: E/AndroidRuntime(4279):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
03-14 18:04:53.656: E/AndroidRuntime(4279):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
03-14 18:04:53.656: E/AndroidRuntime(4279):     ... 2 more

解决方案:

我可以通过调用我的

来解决这个问题
AsyncTask().execute("");

在onCreate()中,以便创建类本身,然后在我希望它运行的地方调用它...

1 个答案:

答案 0 :(得分:0)

在那里不会调用必须在UI线程中调用的东西。 1.您必须在UI线程上调用AsyncTask的{​​{1}}。 2.不要在execute(视图)上处理UI对象。

请向我们提供有关AsyncTask课程(究竟是什么?)以及执行Enemy的代码的更多信息。

在向我们提供其余代码后: 正如我所说,你从一个不是UI线程的线程开始AsyncTask。 您的AsyncTask实施SurfaceView,执行Runnable的部分位于AsyncTask方法中。 在您的活动Thread.run中,您正在创建onCreate,在SurfaceView(在onResume之后调用),您正在启动一个新线程(t1),执行{{ 1}}。 为了能够正确执行此onCreate,您需要将执行此操作的代码发布到UI线程。必须从UI线程启动AsyncTask

请阅读AsyncTask课程: http://developer.android.com/reference/android/os/Handler.html

你可以在这里看到一个简单的例子: Android: Accessing UI Element from timer thread

我不知道为什么它在4.1中工作,也许他们做了一些更改来覆盖从UI线程执行AsyncTasks的错误。