Android: How to use a Handler handleMessage and access the reference to the MainActivity

半世苍凉 提交于 2019-12-05 23:33:11

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!