Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弱引用活动_Java_Android_Android Service_Weak References - Fatal编程技术网

Java 弱引用活动

Java 弱引用活动,java,android,android-service,weak-references,Java,Android,Android Service,Weak References,我想通过消息传递在我的活动和IntentService之间实现双向通信 在处理程序中类作为活动中的内部类实现: class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MessengerService.MSG_SET_VALUE: mC

我想通过消息传递在我的
活动
IntentService
之间实现双向通信

处理程序中
类作为
活动中的内部类实现:

class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MessengerService.MSG_SET_VALUE:
                mCallbackText.setText("Received from service: " + msg.arg1);
                break;
            default:
                super.handleMessage(msg);
        }
    }
}
以相同的方式实现my
处理程序将导致以下警告:

此处理程序类应该是静态的,否则可能会发生泄漏

签出后,我将我的实现为一个静态嵌套类,如下所示:

private static class IncomingHandler extends Handler {

    private final WeakReference<MainActivity> mainActivity;

    IncomingHandler(MainActivity activity) {
        mainActivity = new WeakReference<MainActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        MainActivity activity = mainActivity.get();
        if(activity != null) {
            activity.doStuff();
        }
    }
}
私有静态类IncomingHandler扩展了Handler{
私人最终WeakReference main活动;
收入管理员(主要活动){
mainActivity=新的WeakReference(活动);
}
@凌驾
公共无效handleMessage(消息消息消息){
MainActivity=MainActivity.get();
if(活动!=null){
activity.doStuff();
}
}
}
这是处理上述警告的安全方法吗


提前感谢。

您完全可以忽略该警告:仅当消息以“延迟”方式发送时有效,而“延迟”对于
Messenger
不适用,顺便说一句,如果您的活动和服务由同一进程托管,您只需使用“绑定本地服务”模式,无需
Messenger
或such@pskink谢谢你的评论。是否可以使用绑定的本地服务模式实现双向通信?据我所知,我可以通过这种方式调用我的服务的方法,但我不能在不使用Messenger的情况下从我的服务调用我的活动的方法。让您的活动只调用“register”方法,并使用回调接口作为参数,然后,您的服务可以在回调Activity时使用该接口如果我的Activity实现了该接口,并且我将Activity实例传递给该服务,它不会在方向更改时导致内存泄漏,并使我的服务回调到“已销毁的”活动?所以过程如下:您在
活动#onCreate
内部调用
bindService
,在
onServiceConnected
内部调用iface的“注册”方法,在
活动#onestory
内部调用“取消注册”方法后跟
取消绑定服务
您完全可以忽略该警告:仅当消息以“延迟”方式发送时才有效,而
Messenger
则不是这种情况,顺便说一句,如果您的活动和服务由同一进程托管,您可以使用“绑定本地服务”模式,无需
信使
或such@pskink谢谢你的评论。是否可以使用绑定的本地服务模式实现双向通信?据我所知,我可以通过这种方式调用我的服务的方法,但我不能在不使用Messenger的情况下从我的服务调用我的活动的方法。让您的活动只调用“register”方法,并使用回调接口作为参数,然后,您的服务可以在回调Activity时使用该接口如果我的Activity实现了该接口,并且我将Activity实例传递给该服务,它不会在方向更改时导致内存泄漏,并使我的服务回调到“已销毁的”活动?所以过程如下:您调用
bindService
inside
Activity\onCreate
,inside
onServiceConnected
您用iface调用“register”方法,inside
Activity\onDestroy
您首先调用“unregister”方法,然后调用
unbindService