Messageについて

3096 ワード

Android UIスレッドモデル------------------------UI:User InterfaceUIスレッド:Androidでは、メインスレッドのタスクはレイアウトのロード、初期化コントロール、構成コントロールの各属性およびリスナー、レスポンスイベントであり、これらのタスクはUIコントロールに関連しているため、AndroidのメインスレッドはUIスレッドとも呼ばれる.メインスレッドの使用原則は、UI関連の業務のみを処理し、必要な初期化を完了し、他のタスクはできるだけサブスレッドで完了し、ANRを回避することです.メインスレッドのUIコントロールが正しく更新、表示されることを保証するために、AndroidではサブスレッドのUIコントロールの更新は許可されない(厳密には、UIを作成するスレッドのみがUIを更新することを許可する).Androidにおけるスレッド通信モデル-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Androidでは,スレッド間通信は「メッセージメカニズム」を用いて実現される.サブスレッドでは,Handlerのクラスを用いてメッセージを発行し,メインスレッドではHandlerを用いてUIを更新する.
Messageについて-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Messageの一般的なプロパティは、int what:メッセージのタイプIDを表し、開発者が任意に指定することができ、通常は静的定数を使用するべきであり、また、各メッセージのint値が異なるべきであるint arg 1:メッセージにカプセル化する必要があるintタイプデータを示す.この属性の値は、数値的意味を持つint arg 2:arg 1 Object obj:参照arg 1としてMessageオブジェクトを作成する:Messageクラスはパラメータのない公有的な構造方法を提供するが、new Message()のような構文でオブジェクトを作成することは推奨されず、Messageを使用する.Obtain()シリーズメソッドは、Messageクラスの内部でメッセージオブジェクトの作成、管理などのシステム機能が実現されているため、オブジェクトを取得します.Messageのobtain()シリーズメソッドを使用する場合、obtain()メソッドでHandlerオブジェクトが指定されている場合は、最後にMessageオブジェクトのsendToTarget()メソッドを使用してメッセージの送信を実行する必要があります.
        pbProgress = (ProgressBar) findViewById(R.id.pb_progress);
        
        handler = new InnerHandler();
    }
    
    private class UpdateProgressThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
//                Message msg = Message.obtain(handler);
//                msg.what = MESSAGE_UPDATE_PROGRESS;
//                msg.arg1 = i + 1;
//                msg.sendToTarget();
                
                //   1:          (handler)
                //   2:     (what)
                //   3:      (arg1)
                //   4:      (arg2,        )
                Message.obtain(handler, MESSAGE_UPDATE_PROGRESS, i+1, 0).sendToTarget();
                
                // handler.sendMessage(msg);
                // handler.sendEmptyMessage(MESSAGE_UPDATE_PROGRESS);
                
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    private class InnerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            if(MESSAGE_UPDATE_PROGRESS == msg.what) {
                pbProgress.setProgress(msg.arg1);
            }
        }
    }