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

我有一个从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静态?
  • 什么是正确的方式来传递给MainActivity的引用? 现在我得到错误:“不能在范围内访问typesMainActivity的封闭实例”

你可以让一个类(Activity / Service)实现Handler.Callback并通过new Handler(this)为它创build一个新的Handler。

您可以更改您的代码,如下所示:

  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; } 

这是一个很好的解释,为什么处理程序应该是静态

这个Handler类应该是静态的或者可能发生泄漏:IncomingHandler

关于你的另一个问题,如果你使Handler静态化,你也应该使所有在你使用的字段都是静态的。

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