首页 \ 问答 \ 此消息无法回收,因为它仍在使用中(This message cannot be recycled because it is still in use)

此消息无法回收,因为它仍在使用中(This message cannot be recycled because it is still in use)

我正在尝试使用本文来创建异步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).sendToTarget();
    }
}

但是当我运行代码时,我得到了提到的java.lang.IllegalStateException: This message cannot be recycled because it is still in use. 当试图回收消息时。 为什么这样以及如何解决它并防止内存泄漏?


I'm trying to use this article to create asynchronous UDP socket.

So I've this code:

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).sendToTarget();
    }
}

But when I run the code, I get the mentioned java.lang.IllegalStateException: This message cannot be recycled because it is still in use. when trying to recycle the message. Why is that and how to solve it and prevent memory leaks?


原文:https://stackoverflow.com/questions/44020010
更新时间:2021-12-30 10:12

最满意答案

您有两种方法可以实现此目的。 您可以使用Search Console,也可以使用Developer Console。

要使用Search Console方法,您需要拥有Google Play上应用的管理权限,并使用Search Console中的同一帐户登录。 在这里,您可以为应用添加新属性,并以支持的格式[android-app:// {apk_package_name} /]指定应用的根URI,类似于以下示例:

android-app://com.example/

接下来,SC会验证您的帐户是否与应用所有者的Play帐户相同,并自动验证应用属性。 但是,如果您的SC帐户与Google Play不同,您可以随时要求SC帐户的所有者将您添加为应用属性的所有者或用户。

然后验证过程最多可能需要48小时。 您可以在此处查看有关此流程的更多信息 - https://support.google.com/webmasters/answer/6178045

要使用Developer Console方法,您只需向网站站长发送请求即可。 一旦网站管理员批准您的请求,验证过程将立即开始,持续长达48小时。 您可以在此处获得有关此方法的更多信息 - https://support.google.com/googleplay/android-developer/answer/6041489

在您为深层链接使用HTTP方案的情况下,只需要这两种方法就可以将内容编入索引。 如果您使用自定义方案,则仍需要通过使用站点地图或网站注释来提供深层链接。


You have two options to accomplish this. You use the Search Console or you can use the Developer Console.

For using the Search Console approach, you need to have management rights on the app on Google Play and be logged in with that same account in Search Console. Here, you can add a new property for your app and specify the app's root URI in the supported format [android-app://{apk_package_name}/], similar as the following example:

android-app://com.example/

Next, the SC will verify if your account is the same as the app owner's Play account and automatically verify the app property. However, if your SC account is not the same as your Google Play, you can always ask the owner of the SC account to add you as an owner or user of the app property.

Then the process of validation can take up to 48 hours. You can see more information about this process in here - https://support.google.com/webmasters/answer/6178045

For using the Developer Console approach, you just need to send a request to the website webmaster. As soon as the webmaster approves your request, the process of validation will begin, lasting up to 48 hours as well. You can have more information about this approach in here - https://support.google.com/googleplay/android-developer/answer/6041489

These two approaches are all you need to do in order to get your content indexed, in the case that you use the HTTP scheme for your deep links. If instead you use a custom scheme, you still need to provide your deep links through the use of a sitemap or website annotations.

相关问答

更多

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)