【问题标题】:Android: How to use a Handler handleMessage and access the reference to the MainActivityAndroid:如何使用 Handler handleMessage 并访问对 MainActivity 的引用
【发布时间】:2013-06-12 23:40:02
【问题描述】:

我有一个从 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 需要是静态的吗?没有静态,我得到“这个处理程序类应该是静态的,否则可能会发生泄漏”
  • mCamera 需要是静态的吗?我被告知要使 mCamera 成为静态的,但为什么这是必要的?有没有办法在不使 mCamera 静态的情况下设置 takePicture?
  • 将引用传递给 MainActivity 的正确方法是什么?现在我收到错误消息:“在范围内没有可以访问 MainActivity 类型的封闭实例”

【问题讨论】:

标签: android android-handler


【解决方案1】:

您可以让一个类(活动/服务)实现Handler.Callback,并通过new Handler(this)为其创建一个新的处理程序。

【讨论】:

  • 与本文中描述的其他方法相比,这起到了作用,因为它简化了很多开销(我不必传递对象等)。
【解决方案2】:

您可以按如下方式更改您的代码:

    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】:

    这里很好地解释了为什么处理程序应该是静态的:

    This Handler class should be static or leaks might occur: IncomingHandler

    关于您的其他问题,如果您将 Handler 设为静态,您还应该将您在其中使用的所有字段设为静态。

    【讨论】:

      【解决方案4】:

      您可以使用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);
              }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        相关资源
        最近更新 更多