2017-05-24 93 views
0

Here, in this answerActivity實例保存在WeakReference<Activity>變量中。這樣可以避免內存泄漏。這樣做是否是一種好的做法?是否將活動實例保存在WeakReference中是一種很好的做法

public class BackgroundService extends IntentService { 
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) { 
     mActivityRef = new WeakReference<>(activity); 
    } 
} 

我正在使用mActivityRef.get()並將其轉換爲所需的活動對象。使用該對象,訪問活動中的方法。

的目的是從服務的訪問活動的方法,這個代碼的工作,但按照該意見,我很困惑是否使用與否

我已經提到了document尚未明確。

回答

2

這是否是一個很好的做法?

目的是從服務

即活動可能不存在訪問活性的方法。例如,用戶可以在服務運行時按BACK並銷燬活動。對被銷燬的活動調用方法可能會導致崩潰。

使用事件總線(LocalBroadcastManager,greenrobot的EventBus等)進行組件之間的鬆散耦合通信,例如服務和活動之間的通信。在活動可見時讓活動註冊,並根據需要提供服務發佈活動。

+0

我已經實現了[LocalBroadcastManager](https://stackoverflow.com/a/25172526/2820534)它正在完成任務,但我們可以相信這個廣播嗎?會一直處理? – Prabs

+0

@Prabs:我不知道你的意思是「相信這個廣播」或「總是處理」。根據定義,可能沒有註冊某個事件。但是,在這種情況下,服務可以瞭解它並採取其他措施。例如,您可以發送本地廣播,並且如果您沒有前景用戶界面來接收該事件,則該服務可以改爲「通知」。請參閱[本示例應用程序](https://github.com/commonsguy/cw-omnibus/tree/v8.5/EventBus/LocalBroadcastManager)。 – CommonsWare

0

沒有它不是一個很好的做法,存儲在你的項目中的任何地方,但如果你想這樣做,創建接口的interface實現你的活動,並通過該接口爲您的活動和IntentService到您的服務之間的通信方式的Activity參考。

現在,您的服務可以參考您的活動(選定)方法。通過該界面訪問您的數據並在使用後清除引用。

相關問題