【问题标题】:Multiple handlers reusable code多个处理程序可重用代码
【发布时间】:2012-08-01 03:47:03
【问题描述】:

能否请一些人建议在一个活动中使用两个不同的处理程序的替代方法,或者让我知道这种方法可以吗?

详情: 我正在开发一些用于 Microchips ADK Android 入门套件的代码。一切运行顺利,但是,我遇到了一个问题,即代码中运行了两个不同的处理程序,它可以工作,但我注意到不建议这样做。 我用来创建时间延迟的第一个处理程序,并使用 post 命令启动结果。第二个处理程序用于 Microchip 提供的示例代码,用于与 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 

【问题讨论】:

  • 我发现我可以删除该行:final Handler mHandler = new Handler(); 并将mHandler.post(mUpdateResults); 重命名为handler.post(mUpdateResults);。 Microchip 的代码覆盖 Handler.handleMessage 这一事实对 Handler.post 方法没有影响,它可以正常工作。

标签: android usb microchip adk android-handler


【解决方案1】:

您可以为 startTimeDelay 和 USB 附件创建一个单独的处理程序。

来自android的代码。

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

它说当你有一个回调(Runnable)时它会调用handleCallback,它会调用你的Runnable.run方法,否则handleMessage会被调用。

所以你可以有一个处理程序。

【讨论】:

    【解决方案2】:

    感谢 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 的运行在处理程序例程中不明确可见。

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 2013-02-01
      • 2020-03-31
      • 1970-01-01
      • 2017-06-13
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多