问题
I have a service which receives a command from the Internet and launches a background thread. This thread is passed a handler from the service (the service is bounded and passed the handler) and sends a message to the handler to take a picture. I'm stuck on the implementation of the handler.
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//TODO: Handle different types of messages
mCamera.takePicture(null, null, MainActivity.this);
}
};
Questions:
- Does Handler need to be static? Without static, I get "This Handler class should be static or leaks might occur"
- Does mCamera need to be static? I've been told to make mCamera static, but why is this necessary? Is there a way to setup takePicture without making mCamera static?
- What's the proper way to pass the reference to MainActivity? Right now I get the error: "No enclosing instance of the type MainActivity is accessible in scope"
回答1:
You can make a class (Activity/Service) implement Handler.Callback
and create a new Handler for it via new Handler(this)
.
回答2:
You can change your code as follows:
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;
}
回答3:
Here is a good explanation why handler should be static:
This Handler class should be static or leaks might occur: IncomingHandler
About your other question, if you make Handler static you should also make all the fields that you use inside it static.
回答4:
You can use Message member obj
and pass the desired object to the handler.
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);
}
};
来源:https://stackoverflow.com/questions/17140391/android-how-to-use-a-handler-handlemessage-and-access-the-reference-to-the-main