0

Samsung 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()でクラス自体を作成し、実行したい場所でクラスを呼び出します...

4

1 に答える 1

0

UI スレッドで呼び出される必要があるものは、そこでは呼び出されません。1. UI スレッドで を呼び出す必要がありAsyncTaskます。2. (ビュー)executeで UI オブジェクトを処理しないでください。AsyncTask

Enemyクラス (正確には何ですか?) と を実行するコードに関する詳細情報を提供してくださいAsyncTask

残りのコードを提供した後: 先ほど言ったようにAsyncTask、UI スレッドではないスレッドから を開始します。あなたのSurfaceView実装Runnable、およびを実行する部分AsyncTaskThread.runメソッドにあります。onCreateを作成しているアクティビティSurfaceViewonResume(後に呼び出されonCreateます)、を実行する新しいスレッド (t1) を開始していAsyncTaskます。これをAsyncTask適切に実行できるようにするには、それを実行するコードを UI スレッドに投稿する必要があります。AsyncTasksUI スレッドから開始する必要があります。

android.os.Handlerクラス についてお読みください: http://developer.android.com/reference/android/os/Handler.html

ここで簡単な例を見ることができます: Android: タイマー スレッドから UI 要素にアクセスする

なぜ 4.1 で動作しているのかはわかりません。おそらくAsyncTasks、UI スレッドからの実行の間違いをカバーするためにいくつかの変更が加えられたのでしょう。

于 2013-03-14T22:19:11.513 に答える