5

次のエラーが発生し、アプリケーションがクラッシュします。

java.lang.IllegalStateException: 現在のスレッドにはルーパーが必要です!

私はGoogleでルーパーを使用する方法についてあまり知りませんでした。スレッド(主にスリープ機能用)、ハンドラー(非同期タスクの実行中に画像をダウンロードするため)、および非同期タスク(URLからJSONデータを取得するため)を使用しています. この問題を解決する方法がわからないので、提案があれば非常に役立ちます。

これは、ボタンのクリック時に実行されるスレッドのコードです。

View view = flingContainer.getSelectedView();
          view.findViewById(R.id.item_swipe_right_indicator).setAlpha((float) 1.0);

        Thread timer = new Thread() {
            public void run() {
                try {
                    sleep(320);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    flingContainer.getTopCardListener().selectLeft();
                }
            }
        };
        timer.start();

私はこのライブラリを使用しており、log-cat は次のとおりです。 画像

where: at com.enormous.quotesgram.MainActivity$3.run(MainActivity.java:479)in last in log-cat はflingContainer.getTopCardListener().selectLeft();、上記のコードの行: に対応します。

4

1 に答える 1

1

以下を試してください (残念ながらコードをテストできません):

Thread timer = new Thread() {
    public void run() {
        try {
            sleep(320);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    flingContainer.getTopCardListener().selectLeft();
                }
            });
        }
    }
};

背後にある考え方は、Timerスレッドはスレッドではないということです ( 「現在のスレッドにはルーパーが必要Looperです」という例外が発生します)。ただし、UI スレッドはスレッドです (たとえば、このサイトを参照してください)。Looper

おそらくUIスレッドで実行するようflingContainer.getTopCardListener().selectLeft()に設計されているため、パイプライン化されたスレッドの側で呼び出されない場合、失敗します。

于 2015-04-16T17:43:49.167 に答える