Android 上下文和内存泄漏

Android 上下文和内存泄漏,android,Android,在我的应用程序中,我有一个线程和一个相应的处理程序来更新UI。该线程将从我的主活动开始,该线程接受多个参数,包括一个上下文。此上下文的使用方式如下: Context c; MessageHandler handler; public BluetoothCommunicator(Context c) { this.c = c; handler = new MessageHandler(c); } 在我的run()方法中,当发生特殊事件时,我将一些数据发布到此处理程序。在我的hand

在我的应用程序中,我有一个线程和一个相应的处理程序来更新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();
        }
据我所知,我无法使用
getApplicationContext()
创建ProgressDialog,但我需要
活动上下文

我的编码方式将导致我的应用程序内存泄漏,根据

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


我怎样才能绕过这个问题呢?否异步任务不相关,因为问题在
上下文中

当线程结束时(即
run()
方法完成),只需将变量
c
设置为null。这应该可以解决内存泄漏问题。

当线程完成时(即
run()
方法完成),只需将变量
c
设置为null。这将解决您的内存泄漏问题。

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


从将显示进度对话框的处理程序启动一个虚拟活动(可以使用自定义对话框,将
setContentView()
作为要显示进度对话框的布局来执行此操作。还可以将此虚拟活动的主题设置为
android:style/theme.dialog
)。在进度对话框完成或用户按“取消”后,您也可以完成此虚拟活动。

如果David的回答可以解决您的问题,您还可以尝试:


从将显示进度对话框的处理程序启动一个虚拟活动(可以使用自定义对话框,将
setContentView()
作为要显示进度对话框的布局来执行此操作。还可以将此虚拟活动的主题设置为
android:style/theme.dialog
)。在进度对话框完成或用户按“取消”后,您也可以完成此虚拟活动。

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

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

是否要获取位于堆栈顶部的活动的上下文?(这样您就可以显示该活动的对话框了?)。我从我的主活动开始我的线程,并且进度对话框也应该出现在此活动的顶部。是否要获取堆栈顶部活动的上下文?(这样您就可以显示该活动的对话框了?)。我从我的主活动开始我的线程,并且进度对话框也应该出现在这个活动的顶部。