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

Java Android线程:此处理程序类应该是静态的,否则可能会发生泄漏,java,android,android-handler,Java,Android,Android Handler,在一个单独的线程中完成了一项耗时的任务后,我使用处理程序对象继续UI工作。我遇到了上述皮棉警告的问题,下面是我的方法 [示例处理程序对象类型1]-> Handler responseHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Toast.makeText(MainActivity.

在一个单独的线程中完成了一项耗时的任务后,我使用
处理程序
对象继续UI工作。我遇到了上述皮棉警告的问题,下面是我的方法

[示例处理程序对象类型1]->

Handler responseHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);
        Toast.makeText(MainActivity.this, "Finished the long running task in seperate thread...", Toast.LENGTH_LONG).show();
    }       
};
Handler responseHandler = new Handler(new Handler.Callback() 
{       
    @Override
    public boolean handleMessage(Message msg) 
    {   
        Toast.makeText(MainActivity.this, "Finished long running task in a seperate thread...", Toast.LENGTH_LONG).show();
        return false;      // RETURN VALUE ????
    }
});

[示例处理程序对象类型2]->

Handler responseHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);
        Toast.makeText(MainActivity.this, "Finished the long running task in seperate thread...", Toast.LENGTH_LONG).show();
    }       
};
Handler responseHandler = new Handler(new Handler.Callback() 
{       
    @Override
    public boolean handleMessage(Message msg) 
    {   
        Toast.makeText(MainActivity.this, "Finished long running task in a seperate thread...", Toast.LENGTH_LONG).show();
        return false;      // RETURN VALUE ????
    }
});
在单独的线程(而不是UI)中,当耗时的任务完成时,它执行以下行将控件返回UI线程(基本上是处理程序obj)


该程序在这两种类型的处理程序对象上都运行得很好,但是在第1种类型上,我得到一个Lint警告,说这个处理程序类应该是静态的,否则可能会发生泄漏

因此,我开始使用第二种类型的handler对象来避免Lint警告,但我遇到的问题是,我不确定第二种方式中返回值(true/false)的含义,并且它也可以使用这两种方式。我在谷歌上搜索了这么多,但没有得到解释这个返回值的确切答案

是的,我在stackoverflow的很多地方都看到了这个问题,主要是关于Lint警告的问题,但我的问题主要是关于第二种方式的返回类型,并确认我使用第二种处理程序Obj解决问题的方式是否正确

问题->

Handler responseHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);
        Toast.makeText(MainActivity.this, "Finished the long running task in seperate thread...", Toast.LENGTH_LONG).show();
    }       
};
Handler responseHandler = new Handler(new Handler.Callback() 
{       
    @Override
    public boolean handleMessage(Message msg) 
    {   
        Toast.makeText(MainActivity.this, "Finished long running task in a seperate thread...", Toast.LENGTH_LONG).show();
        return false;      // RETURN VALUE ????
    }
});
1)。有人知道这个返回值的确切含义(真/假)吗

2)。我所做的消除皮棉警告是否正确


谢谢…

我发现了一些关于内部类(如handler)内存泄漏的重要信息,希望与您分享:

我认为Handler类的重写方法不会返回任何内容,您可以检查:


您已经重写了Java处理程序类而不是Android处理程序,您可以看到Java处理程序类的handleMessage()有返回语句,您也可以在这里检查返回语句的原因:

每个处理程序都绑定到线程的
循环器,每个
消息都放在一个数据结构,一个消息队列上

消息
有一个指向
处理程序的
目标
变量,一个指向
可运行
回调
变量

因此,如果您使用匿名类来创建
处理程序
对象(如第一个示例中所示),那么就要知道匿名/非静态内部类包含对外部对象的引用(活动?)。因此,发布在队列上的消息可能持有对
处理程序的引用作为目标,而
处理程序
反过来持有对外部类的引用,如
活动

现在,只要线程正在运行,消息就可以在消息队列中停留很长的时间间隔。与此同时,该活动可能已被取消。但是它不会被垃圾收集,因为它的间接引用是模糊的,消息中有。请注意,只要线程在运行,循环器和消息队列就会一直存在

在第二个示例中,您没有创建匿名
处理程序
类。您正在使用处理程序构造函数并向其传递一个匿名的
回调
对象。这可能会阻止Lint抱怨,但我怀疑这是一个好方法。只需避免内部类,避免将活动或上下文引用传递给处理程序

更新:

处理程序的
dispatchMessage()
获取要处理的消息,检查是否提供了回调,如果提供了回调,则不调用
handleMessage()
,如果回调的
handleMessage()
返回true:

public void dispatchMessage(Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback != null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg); //--won't be called if you return true.
    }
}

是的,请查看链接的帖子。我看到了这些链接,我的问题主要是关于返回值,我没有在这些链接中找到解释。。检查这个和这个。查看romain guy关于主题和解决方案的讨论。