Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 此消息无法回收,因为它仍在使用中大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用 this article来创建异步UDP套接字.

所以我有这个代码

import android.os.Handler;
import android.os.HandlerThread;
import android.os.message;

import java.net.DatagramSocket;
import java.net.socketException;

public class UdpThread
    extends HandlerThread {

    private static final String TAG = "UDP";
    private final Handler uiHandler,workerHandler;
    private final DatagramSocket socket = new DatagramSocket();

    public UdpThread(final Handler uiHandler,final String hostname,final int port) throws SocketException {
        super(tag);
        thiS.UiHandler = uiHandler;
        start();
        workerHandler = new Handler(getLooper(),new Handler.CallBACk() {
            @Override
            public Boolean handlemessage(final message msg) {
                /*
                if (msg.what == port && msg.obj == hostName) {
                    final InetSocketAddress address = new InetSocketAddress(hostname,port);
                    Log.d(tag,"ConnecTing to " + address);
                    try {
                        socket.connect(address);
                    } catch (SocketException sE) {
                        throw new RuntimeException(sE);
                    }
                }
                */
                msg.recycle(); //java.lang.IllegalStateException: This message cAnnot be recycled because it is still in use.
                return true;
            }
        });
        workerHandler.obtainmessage(port,hostName).send@R_584_10586@rget();
    }
}

但是当我运行代码时,我得到了提到的java.lang.IllegalStateException:此消息无法回收,因为它仍在使用中.当试图回收消息时.为什么这样以及如何解决它并防止内存泄漏?

解决方法

首先,让我们看看message recycle()方法是如何工作的.
public void recycle() {
    if (isInUse()) {
        if (gcheckRecyclE) {
            throw new IllegalStateException("This message cAnnot be recycled because it "
                    + "is still in use.");
        }
        return;
    }
    recycleUnchecked();
}

因此,如果正在使用它,您将收到IllegalStateException

isInUse()只是检查标志,看起来像:

Boolean isInUse() {
        return ((flags & FLAG_IN_USE) == FLAG_IN_USE);
    }

当我们尝试阅读该标志时,我们会看到描述:

那么我们有什么

>你不能回收消息,直到它“正在使用”
>在获得或创建新消息之前,它“正在使用中”

如何解决问题

message类中有一个方法recycleUnchecked()来回收消息对象,即使它正在使用中.想要你需要的东西!说明:

最糟糕的是它在内部使用并具有包访问权限.当你打电话时它在内部使用的好东西:

handler.removemessages(int what)

所以我想最终解决方案是:

更换

@H_571_4@msg.recycle();

try {
     msg.recycle(); //it can work in some situations
} catch (IllegalStateException E) {
     workerHandler.removemessages(msg.what); //if recycle doesnt work we do it manually
}

大佬总结

以上是大佬教程为你收集整理的android – 此消息无法回收,因为它仍在使用中全部内容,希望文章能够帮你解决android – 此消息无法回收,因为它仍在使用中所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。