0

私の質問は、Java ルーパーと、それらを正しい方法で停止する方法に関するものです。

次のようなスレッドが定義されているとしましょう。

    class NoLooperThread extends Thread{
        @Override
        public void run(){

            Thread.sleep(2000);

        }
}

そして、私はほぼ同じですが、ルーパーを備えた別のスレッドを持っています:

class LooperThread extends Thread{

    @Override
    public void run(){
        Looper.prepare();

        Thread.sleep(2000);

        Looper.loop();
    }
}

もしそうなら: new NoLooperThread().start();私は2秒後にこのスレッドが死ぬ可能性があることを知りたいのですが、もしそうなら: new LooperThread().start(); スレッドは永遠にブロックし続けますか? 私の仮定は正しいですか?

どうすればこのスレッドを停止できますか? ブロッキングを停止するために電話する必要があることはわかっLooper.myLooper().quit();ていますが、それを行う最善の方法は何ですか? ハンドラーを介してメッセージを送信して停止する必要がありますか?

したがって、ルーパーの目的は 2 つあります。メッセージ キューを作成するだけでなく、スレッドを存続させます。その仮定も正しいですか?

SO question hereを読んだ後、私の質問が来ます

4

1 に答える 1

2

私自身の試行錯誤と調査を行った後、ルーパーで学んだことを共有したいと思いました。Android では、メイン スレッドにはすでにルーパーが用意されています。そのため、メインスレッドでメッセージをリッスンするハンドラーを作成でき、ルーパーについて心配する必要はありません。しかし、例として、次のようにメインスレッドの外に別のスレッドを作成すると:

      class LooperThread extends Thread{
int count=0;
        int border=100;
        @Override
        public void run(){
           Looper.prepare();

            looperHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    Log.i("HANDLER", "MyLooperThread called");
                    Bundle data = msg.getData();
                    if (data != null) {
                        count++;
                        if (count >= border) {
                            mainHandler.sendEmptyMessage(count);
                            count = 0;
                        }
                    }
                }
            };

           Looper.loop();
        }
    }
LooperThread.start();

、次にルーパーを準備する必要があります。そうしないと、ハンドラーが実行できず、メッセージを処理できません。ハンドラーにはルーパーが必要です! それで、なぜ Looper.prepare() がハンドラーを使用しているときにAndroidメインスレッドで呼び出されなかったのかについての私の混乱でしたが、実際には呼び出されています。

ルーパーは、スレッド間でメッセージを渡すことを目的としています。すでにAndroidによって処理されているため、asychTaskで使用することはありません。そのため、asynchTask では onPreExecute (UI スレッド) がメッセージを doInBackground (バックグラウンド スレッド) に送信し、次に onPostExecute (UI スレッド) にメッセージを送信します。ハンドラーとのメッセージパッシングにルーパーを使用しています。

ルーパーを終了することについては、私は決してしたく​​ないと思います。これは通常、ルーパーを準備することによって作成した一種のメッセージング スレッドであるため、スレッドを実行したままにします。アプリの有効期間中、積極的にメッセージをキューに入れたいと考えています。私の意見では、アプリが死んだら自然に終了させます。

于 2015-12-16T21:15:35.563 に答える