当我在我的三星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()中,以便创建类本身,然后在我希望它运行的地方调用它...
答案 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
的错误。