0

1 つのアクティビティで 2 つの異なるハンドラーを使用する代わりの方法を提案してください。または、この方法で問題ないことを教えてください。

詳細: Microchips ADK Android スターター キットで使用するコードを開発中です。すべてがスムーズに実行されていますが、コードで 2 つの異なるハンドラーが実行されているという問題があります。動作しますが、推奨されていないことに気付きました。時間遅延を作成するために使用する最初のハンドラーで、post コマンドを使用して結果を起動します。2 番目のハンドラは、USB アクセサリ フレームワーク ファイルと通信するために提供された Microchip のサンプル コードで使用されます。私は、マイクロチップ社のコードを書き直すよりも、いじくり回すことだけを好みます。同様のコード:

public class MainActivity extends Activity 
{   ...
    final Handler mHandler = new Handler(); // handler for startTimeDelay
    ...
    protected void onCreate(Bundle savedInstanceState)
    {   super.onCreate(savedInstanceState);
        ...
        Button btnSetTimeDelay = (Button) findViewById(R.id.btnChangeTimeDelay);
        btnSetTimeDelay.setOnClickListener
            (   new View.OnClickListener() 
                {   public void onClick(View v) 
                    {
                        setBackgroundColorLinearLayout(color.holo_red_dark); //red background
                        displayLockIsOpen(false);   // display closed lock message
                        startTimeDelay();   // wait to open the lock
                    }
                }
            );
    } // onCreate
    ...
    final Runnable mUpdateResults = new Runnable()
    {   public void run()
        {   setBackgroundColorLinearLayout(color.holo_green_dark); //green background
            displayLockIsOpen(true);    // display open lock message
        }
    };

    protected void startTimeDelay()
    {   Thread t = new Thread()
        {   @override
            public void run()
            {   SystemClock.sleep(global_delay);
                mHandler.post(mUpdateResults);  // run mUpdateResults code
            };
        };
        t.start();
    } // startTimeDelay

    // USB accessory handler from Microchip, for ADK
    private Handler handler = new Handler()
    {   @override
        public void handleMessage(Message msg)
        {   
            ...
            switch(msg.what)
            {   case USBAccessoryWhat:
                ...lots of code here from Microchip
            } // switch msg.what
        } // handleMessage
    }; // Handler
} // MainActivity 
4

2 に答える 2

0

Vivek さん、ご回答ありがとうございます。次の行を削除できることもわかりました。

final Handler mHandler = new Handler(); // handler for startTimeDelay

そして名前を変更

mHandler.post(mUpdateResults); // run mUpdateResults code

handler.post(mUpdateResults); // run mUpdateResults code

Microchip のコードが handleMessage をオーバーライドするという事実は、.post メソッドには影響せず、正常に動作します。以下のコードを教えてください。

public class MainActivity extends Activity 
{   ...
// final Handler mHandler = new Handler();  // handler for startTimeDelay, not needed
    ...
    protected void onCreate(Bundle savedInstanceState)
    {   super.onCreate(savedInstanceState);
        ...
        Button btnSetTimeDelay = (Button) findViewById(R.id.btnChangeTimeDelay);
        btnSetTimeDelay.setOnClickListener
            (   new View.OnClickListener() 
                {   public void onClick(View v) 
                    {
                        setBackgroundColorLinearLayout(color.holo_red_dark); //red background
                        displayLockIsOpen(false);   // display closed lock message
                        startTimeDelay();   // wait to close the lock
                    }
                }
            );
    } // onCreate
    ...
    final Runnable mUpdateResults = new Runnable()
    {   public void run()
        {   setBackgroundColorLinearLayout(color.holo_green_dark); //green background
            displayLockIsOpen(true);    // display open lock message
        }
    };

    protected void startTimeDelay()
    {   Thread t = new Thread()
        {   @override
            public void run()
            {   SystemClock.sleep(global_delay);
                handler.post(mUpdateResults);   // run mUpdateResults code
                // changed from mHandler to handler, defined below
            };
        };
        t.start();
    } // startTimeDelay

    // USB accessory handler from Microchip, for ADK
    private Handler handler = new Handler()
    {   @override
        public void handleMessage(Message msg)
        {   
            ...
            switch(msg.what)
            {   case USBAccessoryWhat:
                ...lots of code here from Microchip
            } // switch msg.what
        } // handleMessage
    }; // Handler
} // MainActivity

コードを書き直す必要がなかったので、これは簡単でしたが、より良い方法かどうかはわかりません。私のバージョンでは、mUpdateResults の実行はハンドラー ルーチンで明示的に表示されません。

于 2012-08-02T04:56:41.020 に答える
0

startTimeDelay と USB アクセサリの両方に対して単一の Handler 自体を作成できます。

アンドロイドのコードから。

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

callback(Runnable) がある場合、Runnable.run メソッドを呼び出す handleCallback が呼び出され、それ以外の場合は handleMessage が呼び出されます。

したがって、単一のハンドラーを持つことができます。

于 2012-08-01T04:15:26.297 に答える