2012-12-04 21 views
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(); 
     } 

按我的理解,我不能getApplicationContext()創建ProgressDialog,但我需要的Activity Context

我的編碼,這將導致我的廣告應用程式內存泄漏,根據MAT

enter image description here

我看到這個痕跡是,c對應的,一路上對象c我在構造函數中initalize 。這是正確的嗎?

我該如何解決這個問題?沒有AsyncTask不相關,因爲問題出在Context

+0

你想獲得堆棧頂部的活動的上下文嗎? (以便您可以在該活動上顯示對話框?) – Shrikant

+0

這是正確的。我從我的主要活動開始我的線程,進度對話框也應該出現在此活動的頂部。 –

回答

3

當線程完成時(即:run()方法完成),只需將變量c設置爲空。這應該照顧你的內存泄漏。

1

David'd答案將解決你的問題,你也可以嘗試:

開始從處理器的虛擬活動,將顯示你的進度對話框(您可以通過使用自定義對話框,setContentView()做的佈局,你想要顯示進行中的對話框,並將此虛擬活動的主題設置爲android:style/Theme.Dialog)。在您的進度對話框結束或用戶按下取消之後,您也完成了此虛擬活動。

2

您還可以使用WeakReference<Context>對象來存儲對您的活動的Context的弱引用,而不是純引用。這將允許GC「收集」您的活動並且不會導致內存泄漏。