有些人可以建议在一项活动中使用两种不同的处理程序,或者让我知道这种方法可以吗?
详细说明: 我正在开发一些用于Microchip 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
答案 0 :(得分:0)
您可以为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。
所以你可以拥有一个处理程序。
答案 1 :(得分: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的运行在处理程序例程中不会明确显示。