Android:如何使用Handler handleMessage并访问对MainActivity的引用

时间:2013-06-17 04:24:17

标签: android android-handler

我有一个服务,它从Internet接收命令并启动后台线程。该线程从服务传递一个处理程序(服务有界并传递处理程序)并向处理程序发送消息以拍照。我坚持执行处理程序。

static Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            //TODO: Handle different types of messages
            mCamera.takePicture(null, null, MainActivity.this);
        }
};

问题:

  • Handler需要静态吗?没有静态,我得到“这个Handler类应该是静态的,否则可能会发生泄漏”
  • mCamera需要静态吗?我被告知要使mCamera静止,但为什么这是必要的?有没有办法在不使mCamera静态的情况下设置takePicture?
  • 将引用传递给MainActivity的正确方法是什么?现在我收到错误:“在范围内无法访问MainActivity类型的封闭实例”

4 个答案:

答案 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);
        }
};