1

在我的应用程序中,我有一个线程和一个相应的处理程序来更新 UI。这个线程将从我的主要活动开始,线程接受几个参数,包括一个上下文。这种上下文是这样使用的:

Context c;
MessageHandler handler;

public BluetoothCommunicator(Context c) {
   this.c = c;
   handler = new MessageHandler(c);
}

在我的run()方法中,当发生特殊事件时,我将一些数据发布到此处理程序。在我的handleMessage()方法中,我创建了一些 ProgressDialogs,以便通知用户正在进行操作。

@Override
    public void handleMessage(Message m) {

        String message = (String) m.obj;

        //Getting files
        if (message.equals("0")) {

            folder.appendToLogFile(new Date().toString(), "Incoming File From: " + deviceName); 

            pd = new ProgressDialog(c);
            pd.setTitle("Please Wait..");
            pd.setMessage("Retrieving file from " + deviceName);
            pd.setCancelable(false);

            pd.show();
        }

据我了解,我无法使用 . 创建 ProgressDialog getApplicationContext(),但我需要Activity Context.

根据 MA​​T,我的编码方式会导致我的应用程序出现内存泄漏

在此处输入图像描述

我看到这个跟踪的方式是c对应于c我在构造函数中初始化的对象。这是正确的吗?

我该如何解决这个问题?没有 AsyncTask 不相关,因为问题出在Context.

4

3 回答 3

3

当线程完成时(即:run()方法完成)只需将变量设置c为空。那应该照顾你的内存泄漏。

于 2012-12-04T09:49:50.113 回答
2

您还可以使用WeakReference<Context>对象来存储Context对您的活动的弱引用,而不是普通引用。这将允许 GC “收集”您的活动,并且不会导致内存泄漏。

于 2012-12-04T10:02:16.970 回答
1

大卫的回答将解决您的问题,您也可以尝试:

从处理程序启动一个虚拟活动,它将显示您的进度对话框(您可以通过使用自定义对话框setContentView()作为您想要在进度对话框中显示的布局来做到这一点。还将此虚拟活动的主题设置为android:style/Theme.Dialog)。在您的进度对话框完成或用户按下取消后,您也完成了这个虚拟活动。

于 2012-12-04T09:54:54.267 回答