我有一个服务,它从Internet接收命令并启动后台线程。该线程从服务传递一个处理程序(服务有界并传递处理程序)并向处理程序发送消息以拍照。我坚持执行处理程序。
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//TODO: Handle different types of messages
mCamera.takePicture(null, null, MainActivity.this);
}
};
问题:
答案 0 :(得分:10)
您可以创建一个类(Activity / Service)实现Handler.Callback
并通过new Handler(this)
为它创建一个新的Handler。
答案 1 :(得分:1)
您可以按如下方式更改代码:
static Handler handler = new Handler() {
MainActivity mActivity;
@Override
public void handleMessage(Message msg) {
//TODO: Handle different types of messages
if(mActivity != null) {
mActivity.mCamera.takePicture(null, null, mActivity);
}
}
};
void MainActivity::onCreate(Bundle savedState) {
...
handler.mActivity = this;
}
void MainActivity::onDestroy() {
...
handler.mActivity = null;
}
答案 2 :(得分:0)
这是一个很好的解释,为什么处理程序应该是静态的:
This Handler class should be static or leaks might occur: IncomingHandler
关于你的另一个问题,如果你使Handler静态,你也应该使你在其中使用的所有字段都是静态的。
答案 3 :(得分:0)
您可以使用Message成员obj
并将所需对象传递给处理程序。
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//TODO: Handle different types of messages
//TODO: handle cast exception
final MainActivity activity = (MainActivity) msg.obj;
final Camera camera = activity.getCamera();
camera.takePicture(null, null, activity);
}
};