【问题标题】:Memory leak in asynctask called repeatedly重复调用异步任务中的内存泄漏
【发布时间】:2014-12-11 06:05:54
【问题描述】:

下面提到的代码中会不会有内存泄漏??

内部有延时1000ms的定时器功能。

new AsyncProcessing().execute(new TestReceive(bytes,datas));

内部类

public class AsyncProcessing extends AsyncTask<Object,Void,Void>{


        @Override
        protected Void doInBackground(Object... r) {
            // TODO Auto-generated method stub
            /*
        byte[] data = passing[0].toString().getBytes();
        int size = Integer.parseInt(passing[1].toString());
        int id = Integer.parseInt(passing[2].toString());*/

            TestReceive ra = (TestReceive)r[0];

            //  System.out.println("res val "+bytArrayToHex(data));
            //  System.out.println("func enter : "+ra.ids);
            func(ra.data,ra.size);
            //  System.out.println("func exit : "+ra.ids);
            ra = null;

            return null;
        }

【问题讨论】:

    标签: android memory-leaks android-asynctask


    【解决方案1】:

    如果ra 是一个包含本机调用的对象,那么是的,绝对可能存在内存泄漏。通常,此类本机代码包含 .dispose().release().clean() 方法(通常都是同义词),请查看有关为该对象管理内存的文档。

    【讨论】:

    • TestReceive 类只有两个数据成员,即 String data 和 int size 。没有从它的 object 进行本地调用,只有 getter 和 setter。但现在我直接访问它们。我想知道 AsyncProcessing 类的对象何时会被收集。
    • Java 对 Java 代码有主动的垃圾收集,因此它会不断被收集。在 Android 中创建内存泄漏实际上是非常困难的,但这是完全有可能的。在这种情况下,我认为这段代码根本不可能造成泄漏。 Async 类本身在其onPostExecute 之后被收集,其中创建的对象在它运行完成时被销毁。关于这段代码需要注意的一点是它不会创建新对象,而是引用现有对象。 ra=null 不会破坏任何东西。
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2012-07-05
    相关资源
    最近更新 更多