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"
4

4 に答える 4

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;
    }     
于 2013-06-17T04:37:25.190 に答える
0

ハンドラーを静的にする必要がある理由の良い説明を次に示します。

この Handler クラスは静的でなければなりません。そうしないと、リークが発生する可能性があります: IncomingHandler

他の質問については、Handler を静的にする場合は、その中で使用するすべてのフィールドも静的にする必要があります。

于 2013-06-17T04:32:45.050 に答える
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);
        }
};
于 2013-06-17T04:34:01.317 に答える